LINUX.ORG.RU

[python][Opengl] LP_c_float

 ,


0

1

Пытаюсь узнать границу в которой можно изменять толщину линии:
glGetFloatv(GL_LINE_WIDTH_RANGE, s), но не могу найти верный тип для s.

expected LP_c_float instance instead of list
Как правильно взять диапазон? Как объявить переменную этого типа?
Спасибо.

★★★★★

>Пытаюсь узнать границу в которой можно изменять толщину линии:
Это сейчас, кстати, мало актуально. Т.к. толщину, нарисованных стандартными средствами ОпенГЛ линий, изменять можно в весьма небольших пределах.

expected LP_c_float instance instead of list

Этим всё сказано. :-) Ну загляни в недра той обвязки ОпенГЛ, которую используешь.

Bad_ptr ★★★★★
()

Вроде же в PyOpenGL уже давно не используется такой синтаксис? У меня работает как:

s = glGetFloatv(GL_LINE_WIDTH_RANGE)

buddhist ★★★★★
()

Насколько знаю - рендерить линии с помощью GL_LINES и др. уже не кошерно. Используй геометрический шейдер.

Касатаельно твоего вопроса. ОпенЖЛ враппер дебильно работает для некоторых get функций (смотри исходники), поэтому надо использовать raw функции.

Короче:

Импортишь glGetFloatv из raw (и ctypes - тоже пригодятся)

from OpenGL.raw.GL import glGetFloatv as glGetFloatvRAW
import ctypes

Потом кусок кода:

tstr = "var1var2"
glGetFloatvRAW(GL_LINE_WIDTH_RANGE,ctypes.c_char_p(tstr))
LINE_WIDTH_RANGE = struct.unpack('ff', tstr)
в LINE_WIDTH_RANGE будет tuple. У меня это (0.5, 10.0)

rip86oz
()

В реальности драйвер для GL_LINE_WIDTH_RANGE может вернуть неверные величины, поэтому сильно полагаться на это я бы не стал.

Amp ★★★
()
Ответ на: комментарий от Amp

Да, это точно, у меня вернуло (0.5, 10.0), а в реальность от ~1.0 до ~3.5.

deterok ★★★★★
() автор топика
Ответ на: комментарий от deterok

можно контролировать все стадии обработки входных данных: от генерации вершин до цвета пикселей

note173 ★★★★★
()
Ответ на: комментарий от deterok

> Я с шейдерами еще не работал никогда, как это работает? В чем преимущество?

Преимущество в гибкости. Что хочешь - то и рисуешь (в рамках дозволенного ).

Первоначально с шейдерами есть гемор и непонятки, но таки игра стоит свеч. Впоследствии с ними становиться проще, чем без них.

А что и как работает - ответит интернет, а конкретные вопросы можешь задавать.

rip86oz
()
Ответ на: комментарий от rip86oz

А не могли бы вы проверить мой код, то ли я устал и стал тупить по полной, то ли бажит python'овская библиотека:

import pyglet
from OpenGL.GL import *
from abc import ABCMeta, abstractmethod

class _Object():
    __metaclass__ = ABCMeta

    def __init__(self, x, y):
        self.x = x
        self.y = y
       
       
    @abstractmethod
    def draw(self):
        pass

class grid(_Object):
    
    def __init__(self, x = .0, y = .0, width = 400, height = 400
                 , lineWidth = 1.0, row = 10, colomn = 10):
        _Object.__init__(self, x, y)
        self.width, self.height = float(width), float(height)
        self.row = row
        self.colomn = colomn
        self.lineWidth = float(lineWidth)
        self.cellHeight, self.cellWidth = (self.height-(row+1)*self.lineWidth)/row, (self.width-(colomn+1)*self.lineWidth)/colomn
        self.gridMatrix = ()
        lineWidthDiv = lineWidth/2
        
        for i in range(row+1):
            My = y+lineWidthDiv+(self.cellHeight+lineWidth)*i
            self.gridMatrix = self.gridMatrix + ((x, My), (x+self.width, My))
        del(My)
        
        for i in range(colomn+1):
            Mx = x+lineWidthDiv+(self.cellWidth+lineWidth)*i
            self.gridMatrix = self.gridMatrix + ((Mx, y), (Mx, y+self.width))
        del(Mx)
        
        #Testing
        glBegin(GL_LINE)
        for i in self.gridMatrix:
            glVertex2f(*i)
        glEnd()
        
        glLineWidth(1.0)
        glColor3f(1.0, 0, 0)
        glBegin(GL_LINE)
        for i in self.gridMatrix:
            glVertex2f(*i)
        glEnd()

    def draw(self):
        pass

if __name__ == '__main__':
    window = pyglet.window.Window(640, 480, 'Ball\'s', resizable = False)
    width = float(640)
    height = float(480)
    viewBorder = 400
    view = None
    
    glClearColor(.6, .6, .6, 1.0)
    glViewport(0, 0, int(width), int(height))
    
    rate = width / height
    if width<=height:
        view = (0, viewBorder, 0, viewBorder/rate, 0, 1)
    else:
        view = (0, viewBorder*rate, 0, viewBorder, -1, 1)
    glOrtho(*view)
    glClear(GL_COLOR_BUFFER_BIT)
    glLineWidth(5.0)
    a = grid(lineWidth=5.0)
    glFlush()
    pyglet.app.run()
http://ompldr.org/vYjNodA
Результатом должна слуужить ровная таблица, но на самом деле...
Спасибо за внимание.

deterok ★★★★★
() автор топика
Ответ на: комментарий от rip86oz

http://ompldr.org/vYjNpcg
Выступы, неточность. При ширине линии = 4 все ок, но ставишь больше начинает выступать, по моему отрисовка не точная идет.

deterok ★★★★★
() автор топика
Ответ на: комментарий от deterok

Я не знаю какие результаты нужны, поэтому здесь ничем помочь не могу. Искать косяки, в том что где-то пиксельный отступ лишний и т.п. - не собираюсь.

Советую отрисовывать всё труегольниками\квадами.

rip86oz
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.