如何解决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 举报,一经查实,本站将立刻删除。