[英]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.