我按照the OpenGL Book的示例进行了扩展,以显示.3ds文件。我还设法使用OpenCV从我的网络摄像头获取图像,将冲浪操作员应用于它并找到给定标记的单应性。然后将找到的变换应用于3D模型。但是我无法在我的程序中将网络摄像头图片用作纹理背景。按照一些示例创建纹理似乎可以工作,但我无法显示它,因为它似乎打破了OpenGL书籍章节中定义的着色器。我尝试glUseProgram
时尝试使用预定义的着色器程序时返回错误1282。
着色器代码可以在给定的OpenGL Book链接中找到。我创建纹理的代码如下:
void setze_hintergrund()
{
if(gp_DataArray->zugriff_bild == false){
/*gp_DataArray is provided to both threads (opencv & opengl) to exchange data like the webcam picture*/
return;
} else {
// alte Textur löschen
glDeleteTextures(1, &backgroundid);
// lade das Bild als Textur
glGenTextures(1, &backgroundid);
glBindTexture(GL_TEXTURE_2D, backgroundid);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,
gp_DataArray->kamerabild->width, gp_DataArray->kamerabild->height,
0, GL_BGR, GL_UNSIGNED_BYTE, gp_DataArray->kamerabild->imageData);
}
return;
}
void zeichne_hintergrund()
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glDisable(GL_DEPTH_TEST);
glDepthMask(GL_FALSE);
glOrtho(-1, 1, -1, 1, -1, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, backgroundid);
glBegin (GL_QUADS);
glNormal3f(0,0,1);
glTexCoord2f(1.0, 1.0); glVertex3f(1, -1, -1); // Texturkoordinate rechts oben, Punkt rechts oben hinten setzen
glTexCoord2f(0.0, 1.0); glVertex3f(-1, -1, -1); // Texturkoordinate links oben, Punkt links oben hinten setzen
glTexCoord2f(0.0, 0.0); glVertex3f(-1, 1, -1); // Texturkoordinate links unten, Punkt links unten hinten setzen
glTexCoord2f(1.0, 0.0); glVertex3f(1, 1, -1); // Texturkoordinate rechts unten, Punkt rechts unten hinten setzen
glEnd ();
glDisable(GL_TEXTURE_2D);
glMatrixMode(GL_PROJECTION);
//glLoadMatrixf(ProjectionMatrix);
//ProjectionMatrixUniformLocation = glGetUniformLocation(ShaderIds[0], "ProjectionMatrix");
glUniformMatrix4fv(ProjectionMatrixUniformLocation, 1, GL_FALSE, ProjectionMatrix.m);
glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE);
return;
}
答案 0 :(得分:0)
如前所述,您不应使用已弃用的函数。大多数已弃用的代码都出现在zeichne_hintergrund()中。 如果要将网络摄像头图像用作进一步渲染的背景,则应使用FBO(帧缓冲对象)。在FBO的帮助下,您可以将网络摄像头图像加载到缓冲区,然后使用相同的缓冲区进行渲染。然后你就可以将这个缓冲区加载到纹理中并像在zeichne_hintergrund()函数中尝试一样在屏幕上显示它。
用于渲染我曾经使用的纹理的顶点和片段着色器如下所示:
顶点着色器:
#version 430
layout(location=0) in vec4 currentPos;
layout(location=1) in vec2 texPos;
out vec2 ex_TexCoor;
void main(void)
{
gl_Position = currentPos;
ex_TexCoor = texPos;
}
currentPos是顶点的位置,texPos是相关的uv坐标。
片段着色器:
#version 430
in vec2 ex_TexCoor;
out vec4 color;
uniform sampler2D texture;
void main(void){
color = texture2D(texture, ex_TexCoor);
}
ex_TexCoor是顶点着色器的uv坐标,纹理是网络摄像头图像,在这种情况下,渲染的场景就在其上。