【问题标题】:Pyopengl: OSError: exception: access violation reading 0x000001E5AE56E000 while adding a texturePyopengl:OSError:异常:在添加纹理时访问冲突读取 0x000001E5AE56E000
【发布时间】:2021-10-12 16:28:49
【问题描述】:

此异常在尝试将纹理绑定到立方体时随机发生了几次。

纹理功能:

def textureBind():
    img = Image.open('Image.png')
    img_data = numpy.array(list(img.getdata()), numpy.int8)
    glEnable(GL_TEXTURE_2D)
    texture_id = glGenTextures(1)
    glBindTexture(GL_TEXTURE_2D, texture_id)
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER)
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER)
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img.size[0], img.size[1],
             0, GL_RGBA, GL_UNSIGNED_BYTE, img_data)

    return texture_id

尝试使用另一张图片时发生了几次,然后随机停止给我异常。有什么办法可以永久阻止错误发生?如果没有,是否有任何替代方法可以更改上面的纹理功能,使其不再发生?

完整代码:

import time
import numpy
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
from PIL import Image

x = 3
y = 1
z = 1


width = 500
height = 500

vertices = [(-1,-1,-1), ( 1,-1,-1), ( 1, 1,-1), (-1, 1,-1), (-1,-1, 1), ( 1,-1, 1), ( 1, 1, 1), (-1, 1, 1)]
faces = [(4,0,3,7), (1,0,4,5), (0,1,2,3), (1,5,6,2), (3,2,6,7), (5,4,7,6)]
colors = [(1, 0, 0), (0, 1, 0), (0, 0, 1), (1, 1, 0), (1, 0, 1), (0, 1, 1)]

def cube():

    glRotatef(1, 3, 1, 1)
    glColor3fv((3, 1, 1))
    glBegin(GL_QUADS)
    for i, face in enumerate(faces):
        glColor3fv(colors[i])
        for surftex, vertex in enumerate(face):
            if surftex == 0:
                glTexCoord2f(0.0, 0.0)
            elif surftex == 1:
                glTexCoord2f(0.0, 1.0)
            elif surftex == 2:
                glTexCoord2f(1.0, 1.0)
            elif surftex == 3:
                glTexCoord2f(1.0, 0.0)
            glVertex3fv(vertices[vertex])
    glEnd()




def textureBind():
    img = Image.open('Image.png')
    img_data = numpy.array(list(img.getdata()), numpy.int8)
    glEnable(GL_TEXTURE_2D)
    texture_id = glGenTextures(1)
    glBindTexture(GL_TEXTURE_2D, texture_id)
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER)
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER)
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img.size[0], img.size[1],
                 0, GL_RGBA, GL_UNSIGNED_BYTE, img_data)

    return texture_id

def showScreen():
    global width, height
    glClearColor(0, 0, 0, 1)

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    cube()
    glEnable(GL_DEPTH_TEST)
    glEnable(GL_LIGHTING)
    glEnable(GL_LIGHT0)
    glEnable(GL_COLOR_MATERIAL)
    glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE)
    glLight(GL_LIGHT0, GL_POSITION,  (2, 2, 2, 1)) # point light from the left, top, front
    glLightfv(GL_LIGHT0, GL_AMBIENT, (0, 1, 0, 1))

    glutSwapBuffers()


def mouseTracker(mousex, mousey):
    print(f"Mouse pos: {mousex}, {mousey}")


def reshapeWindow(x, y):
    global width, height
    width = x
    height = y
    print(x, y)
    glutReshapeWindow(width, height)
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    gluPerspective(45, (width / height), 0.0001, 1000)
    glViewport(0, 0, width, height)
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()
    glTranslatef(0, 0, -5)



glutInit()
glutInitDisplayMode(GLUT_RGBA)
glutInitWindowSize(500, 500)
wind = glutCreateWindow("OpenGL")
glutDisplayFunc(showScreen)
glutIdleFunc(showScreen)
glutMotionFunc(mouseTracker)
glutPassiveMotionFunc(mouseTracker)
glutReshapeFunc(reshapeWindow)
gluPerspective(45, (width / height), 0.0001, 1000)

textureBind()

while True:
    glutMainLoopEvent()
    glutPostRedisplay()
    time.sleep(0.001)

编辑:每次运行程序时,十六进制数都会发生变化,并且在空闲状态下运行不会退出程序。

【问题讨论】:

    标签: python opengl textures pyopengl


    【解决方案1】:

    格式参数取决于图像模式 (img.mode)。您必须检查图像模式:

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img.size[0], img.size[1], 0, GL_RGBA, GL_UNSIGNED_BYTE, img_data)

    format = GL_RGBA if img.mode == 'RGBA' else GL_RGB
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img.size[0], img.size[1],
                 0, format, GL_UNSIGNED_BYTE, img_data)
    

    当纹理被激活时,默认情况下纹理元素的颜色乘以当前颜色,因为默认情况下纹理环境模式(GL_TEXTURE_ENV_MODE)是GL_MODULATE。见glTexEnv

    这会导致纹理纹素的颜色与您在glColor3f 设置的最后一种颜色“混合”。

    在渲染纹理之前设置“白色”颜色:

    vertices = [(-1,-1,-1), ( 1,-1,-1), ( 1, 1,-1), (-1, 1,-1), (-1,-1, 1), ( 1,-1, 1), ( 1, 1, 1), (-1, 1, 1)]
    faces = [(4,0,3,7), (1,0,4,5), (0,1,2,3), (1,5,6,2), (3,2,6,7), (5,4,7,6)]
    colors = [(1, 0, 0), (0, 1, 0), (0, 0, 1), (1, 1, 0), (1, 0, 1), (0, 1, 1)]
    uv = [(0, 0), (0, 1), (1, 1), (1, 0)]
    
    def cube():
    
        glRotatef(1, 3, 1, 1)
        glColor3fv((3, 1, 1))
        glBegin(GL_QUADS)
        glColor3f(1, 1, 1)        # <--- INSERT
        for i, face in enumerate(faces):
            
            # glColor3fv(colors[i]) <--- DELETE
            
            for surftex, vertex in enumerate(face):
                glTexCoord2fv(uv[surftex])
                glVertex3fv(vertices[vertex])
        glEnd()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-06
      • 2014-11-01
      • 1970-01-01
      • 2023-03-15
      • 2015-05-01
      • 2013-11-22
      • 1970-01-01
      • 2016-07-25
      相关资源
      最近更新 更多