微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PyOpenGL 在着色器中显示纹理

如何解决PyOpenGL 在着色器中显示纹理

我对 PyOpenGL 完全陌生,正在尝试为实时摄像机镜头添加着色器。

素材正确显示,着色器(已注释掉,因为其中还没有任何内容)也能正常工作。

问题是我不知道如何在片段着色器中显示相机纹理。有人可以帮忙吗?

初始化:

def init():
    #glclearcolor (r,g,b,alpha)
    glClearColor(0.0,0.0,1.0)
    glutdisplayFunc(display)
    glutReshapeFunc(reshape)
    glutKeyboardFunc(keyboard)
    glutIdleFunc(idle)

    fragmentShader = compileShader(getFileContent("shader.frag"),GL_FRAGMENT_SHADER)
    global shaderProgram
    shaderProgram = glCreateProgram()
    glAttachShader(shaderProgram,fragmentShader)
    glLinkProgram(shaderProgram)

    #gluseProgram(shaderProgram) SHADER HAS nothing IN IT

重复每一帧

def idle():
    # capture next frame
    global capture
    _,image = capture.read()
    image = cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
    image = cv2.flip(image,-1)

    glTexImage2D(GL_TEXTURE_2D,GL_RGB,1280,720,GL_UNSIGNED_BYTE,image)
    cv2.imshow('frame',image)
    glutPostRedisplay()
def display():
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    glEnable(GL_TEXTURE_2D)
    
    # this one is necessary with texture2d for some reason
    glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST)
    # Set Projection Matrix
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    gluOrtho2D(0,width,height)
    # Switch to Model View Matrix
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()
    # Draw textured Quads
    glBegin(GL_QUADS)
    glTexCoord2f(0.0,0.0)
    glVertex2f(0.0,0.0)
    glTexCoord2f(1.0,0.0)
    glVertex2f(width,1.0)
    glVertex2f(width,height)
    glTexCoord2f(0.0,1.0)
    glVertex2f(0.0,height)
    glEnd()
    glFlush()
    glutSwapBuffers()

解决方法

首先请注意,您使用的是过时的 OpenGL 和 GLSL 版本以及过时的技术。阅读教程(例如 LearnOpenGL)以了解最先进的实现。


向着色器添加纹理 Sampler Uniform 变量。通过纹理对象和采样器的绑定通过纹理单元发生。由于纹理对象绑定到纹理单元 0 (glActiveTexture),因此您根本不需要设置采样器,因为其默认值为 0。但是您可以使用 glUniform1f 进行设置。 使用 texture2d 函数从纹理中提取纹素(另见 Combine Texture + Fragment

顶点着色器

void main()
{
    // [...]

    gl_TexCoord[0] = gl_MultiTexCoord0;

    // [...]
}

片段着色器

uniform sampler2D u_texture;

void main()
{
    // [...]

    gl_FragColor = texture2D(u_texture,gl_TexCoord[0].st);
}

片段着色器

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。