纹理

时间:2017-03-23 20:52:09

标签: python opengl pyopengl

我想使用Python PyOpenGL生成三个球体的场景。两侧有颜色(红色和绿色)。中间有任何纹理(砖纹理实际上是与代码在同一目录中的方形jpg文件)。

到目前为止我做了以下事情: enter image description here

由于gluSphere()生成的中间球体中的纹理具有奇怪的行为。有一些小的绿色三角形而不是我的纹理文件。

这是我的纹理文件:

enter image description here

我试图将此文件映射为曲面,例如中间球体上的纹理。我不知道问题出在哪里。

有我的代码,我不知道我错过了什么或者在中间球体上获得适当的纹理映射有什么问题:

from OpenGL.GLUT import *
from OpenGL.GLU import *
from OpenGL.GL import *
import sys
from PIL import Image as Image
import numpy

name = 'Navigation paradigm'

def main():
    glutInit(sys.argv)
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH)
    glutInitWindowSize(800, 800)
    glutInitWindowPosition(350, 200)
    glutCreateWindow(name)
    glClearColor(0., 0., 0., 1.)
    glShadeModel(GL_SMOOTH)
    glEnable(GL_CULL_FACE)
    glEnable(GL_DEPTH_TEST)
    glEnable(GL_LIGHTING)
    lightZeroPosition = [10., 4., 10., 1.]
    lightZeroColor = [0.8, 1.0, 0.8, 1.0]
    glLightfv(GL_LIGHT0, GL_POSITION, lightZeroPosition)
    glLightfv(GL_LIGHT0, GL_DIFFUSE, lightZeroColor)
    glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 0.1)
    glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.05)
    glEnable(GL_LIGHT0)
    glutDisplayFunc(display_scene)
    glMatrixMode(GL_PROJECTION)
    gluPerspective(40., 1., 1., 40.)
    glMatrixMode(GL_MODELVIEW)
    gluLookAt(0, 0, 10,
              0, 0, 0,
              0, 1, 0)
    glPushMatrix()
    glutMainLoop()
    return

def display_scene():
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    glPushMatrix()
    # Textured thing 
    tex = read_texture('brick.jpg')
    qobj = gluNewQuadric()
    gluQuadricTexture(qobj, GL_TRUE)
    glEnable(GL_TEXTURE_2D)
    glBindTexture(GL_TEXTURE_2D, tex)
    glBegin(GL_TRIANGLES)
    gluSphere(qobj, 1, 50, 50)
    gluDeleteQuadric(qobj)
    glDisable(GL_TEXTURE_2D)
    # Left sphere
    color = [1.0, 0.0, 0.0, 1.0]
    glMaterialfv(GL_FRONT, GL_DIFFUSE, color)
    glTranslatef(-2, 0, 0)
    glutSolidSphere(1, 100, 20)
    # Right sphere
    color = [0.0, 1.0, 0.0, 1.0]
    glMaterialfv(GL_FRONT, GL_DIFFUSE, color)
    glTranslatef(4, 0, 0)
    glutSolidSphere(1, 100, 20)
    glPopMatrix()
    glutSwapBuffers()
    return

def read_texture(filename):
    img = Image.open(filename)
    img_data = numpy.array(list(img.getdata()), numpy.int8)
    textID = glGenTextures(1)
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1)
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP)
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP)
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT)
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT)
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL)
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img.size[0], img.size[1], 0, GL_RGB, GL_UNSIGNED_BYTE, img_data)
    return textID

if __name__ == '__main__':
    main()

1 个答案:

答案 0 :(得分:4)

I know that this is in relation to your new question. 但是有一个稍微不同的问题"在眼前。所以,万一其他人有同样的问题,我会去回答。 功能

首先,正如评论中所提到的,您不需要致电glBegin()。因为gluSphere()已经管理了这一点。此外,如果您致电glBegin(),则还需要致电glEnd()。因此,你看到某些东西的原因,主要是因为你让你的驾驶员感到困惑,然后做了一些它不应该做的事情。

  

在生成纹理名称后read_texture()中,您不要绑定它。因此,后续的纹理相关调用将转到默认纹理,而不是新创建的纹理。

textID  = glGenTextures(1)
glBindTexture(GL_TEXTURE_2D, textID) # This is what's missing
     

This is equally found in the answer to the newer question.

添加丢失的glBindTexture()电话后,您将得到如下结果。

现在它可能看起来有点奇怪,看起来可能有些不对劲。但事实是,一切都在按预期运作。问题在于纹理本身。

"问题"是你的砖纹理不是球面映射纹理。如果我们现在只是用球形贴图纹理替换你的砖纹理,那么就得到以下结果。

这里是上面使用的球形贴图纹理: