Отрисовка текстур в pyopengl

Я пытаюсь понять основы работы рендеринга текстур и делаю это с помощью pyopengl, поскольку некоторое время работал с ним.

Я читал кое-какую документацию, от красной книги до туториалов, но моя программа не рендерит никаких текстур — она просто меняет (затемняет) цвета на поверхностях нарисованных объектов.

Вот соответствующий код: функция, которая читает файл изображения, устанавливает свойства текстуры и включает ее,

def generateTexture(texPath):
    im = Image.open(texPath)
    texData = im.tostring('raw', 'RGBX', 0, -1)
    texName = [0]
    glGenTextures(1, texName)
    glBindTexture(GL_TEXTURE_2D, texName[0])
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1)
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP)
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP)
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, texData)
    glEnable(GL_TEXTURE_2D)
    return texName

и функция, создающая список визуализации вершин объекта,

def showVertices(obj):
    Vertices_List = glGenLists(1)
    glNewList(Vertices_List,GL_COMPILE)
    texNames = generateTexture('tex_stone.jpg')
    glBindTexture(GL_TEXTURE_2D, texNames[0])
    glColor3f(1.0,1.0,1.0)
    glBegin(GL_POINTS)
    i=0
    while i < obj.nv:
        glNormal3f(obj.vnormals[i].x, obj.vnormals[i].y, obj.vnormals[i].z)
        glTexCoord2f(obj.texcoords[i].x, obj.texcoords[i].y)
        glVertex3f(obj.vertices[i].x,obj.vertices[i].y,obj.vertices[i].z)
        i = i + 1
    glEnd()
    glEndList()
    return Vertices_List

Я не думаю, что это проблема, но я вычисляю координаты текстуры для каждого объекта вручную (вычисляя пересечение «окружающей сферы» с вектором из центра объекта через каждую вершину).

Если вы хотите увидеть любую другую часть кода, пожалуйста, спросите. Любая подсказка или совет будут высоко оценены.

РЕДАКТИРОВАТЬ: Может быть, проблема в том, что я использую glTexCoord2f() в сочетании с glBegin(GL_POINTS) и, чтобы применить текстуру к поверхности, следует использовать с GL_QUADS, GL_TRIANGLES или любой другой поверхностью? Дело в том, что стороны моих объектов не состоят из определенного типа многоугольника: в основном это треугольники, но есть и четырехугольники.


person freieschaf    schedule 14.12.2011    source источник
comment
Что ж, это было так. Я перенес вызовы glTexCoord2f() в функцию, где она вычисляет стороны объектов:   -  person freieschaf    schedule 15.12.2011
comment
Извините за дублирование ответов. Я еще не совсем знаком с интерфейсом stackoverflow.   -  person freieschaf    schedule 15.12.2011


Ответы (1)


Что ж, это было так. Я перенес вызовы glTexCoord2f() в функцию, вычисляющую стороны объектов:

def showSides(obj):
Sides_List = glGenLists(1)
glNewList(Sides_List,GL_COMPILE)
texNames = generateTexture('tex_pattern.jpg')
glColor3f(1.0,1.0,0.0)
i = 0
while i < obj.ns:
    j = 0
    glBegin(GL_POLYGON)        
    while j < len(obj.sides[i]):
        glNormal3f(obj.vnormals[obj.sides[i][j]].x, obj.vnormals[obj.sides[i][j]].y, obj.vnormals[obj.sides[i][j]].z)
        glTexCoord2f(obj.texcoords[obj.sides[i][j]].x, obj.texcoords[obj.sides[i][j]].y)
        glVertex3f(obj.vertices[obj.sides[i][j]].x, obj.vertices[obj.sides[i][j]].y, obj.vertices[obj.sides[i][j]].z)
        j = j + 1
    glEnd()
    i = i + 1
glEndList()
return Sides_List

Кроме того, я переместил glEnable(GL_TEXTURE_2D) в основную функцию визуализации непосредственно перед тем, как она вызовет showSides().

person freieschaf    schedule 15.12.2011