繁体   English   中英

PyOpenGL 在着色器中显示纹理

[英]PyOpenGL show texture in shader

我对 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()

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


将纹理采样器统一变量添加到着色器。 通过纹理 object 和采样器的绑定通过纹理单元进行。 由于纹理 object 绑定到纹理单元 0 ( glActiveTexture ),因此您根本不需要设置采样器,因为它的默认值为 0。但是您可以使用glUniform1f设置它。
使用texture2d function 从纹理中提取纹素(另请参见组合纹理 + 片段

顶点着色器

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

    gl_TexCoord[0] = gl_MultiTexCoord0;

    // [...]
}

片段着色器

uniform sampler2D u_texture;

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

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

片段着色器

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM