【问题标题】:PyOpenGL show texture in shaderPyOpenGL 在着色器中显示纹理
【发布时间】:2021-07-17 11:08:59
【问题描述】:

我是 PyOpenGL 的新手,我正在尝试将着色器添加到实时摄像机镜头中。

素材正在正确显示,并且着色器(因为其中还没有任何内容而被注释掉)也在工作。

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

初始化:

def init():
    #glclearcolor (r, g, b, alpha)
    glClearColor(0.0, 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,
                 0,
                 GL_RGB,
                 1280, 720,
                 0,
                 GL_RGB,
                 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, 0, 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, 0.0)
    glTexCoord2f(1.0, 1.0)
    glVertex2f(width, height)
    glTexCoord2f(0.0, 1.0)
    glVertex2f(0.0, height)
    glEnd()
    glFlush()
    glutSwapBuffers()

【问题讨论】:

  • "[...] 我不知道如何在片段着色器中显示相机纹理 [...]" - 那么您的片段着色器在哪里?
  • 它在另一个文件中,这里是shader.frag:#version 120 void main() { //gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); }

标签: python opengl glsl fragment-shader pyopengl


【解决方案1】:

请首先注意,您使用的是已弃用的 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);
}

片段着色器

【讨论】:

    猜你喜欢
    • 2023-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-06
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多