Я пытаюсь получить основы того, как работает рендеринг текстур и делать это с 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
Я не думаю, что это проблема, но я вычисляю координаты текстуры для каждого объекта вручную (вычисляя пересечение «окружной сферы» с вектором из центра центра объекта в каждой вершине).
Если вы хотите увидеть любую другую часть кода, пожалуйста, спросите. Любые намеки или советы будут высоко оценены.
EDIT: Может быть, проблема в том, что я использую glTexCoord2f()
в сочетании с glBegin(GL_POINTS)
и, для того, чтобы применить текстуру поверхности, следует использовать с GL_QUADS
, GL_TRIANGLES
или любой другой поверхности? Дело в том, что стороны моих объектов не состоят из определенного типа многоугольника: в основном это треугольники, но есть и четырехугольники.
Ну, это было. Я переместил вызовы на 'glTexCoord2f()' в функцию, где он вычисляет стороны объектов: – freieschaf
Извините за повторяющиеся ответы. Я еще не знаком с интерфейсом stackoverflow. – freieschaf