【发布时间】:2013-01-29 15:39:42
【问题描述】:
我遵循the OpenGL Book 的示例并将其扩展为显示 .3ds 文件。我还设法使用 OpenCV 从我的网络摄像头中获取图像,将 surf 运算符应用于它并找到给定标记的单应性。然后将找到的变换应用于 3D 模型。但是,我无法在我的程序中使用网络摄像头图片作为纹理背景。遵循一些创建纹理的示例似乎有效,但我无法显示它,因为它似乎破坏了 OpenGL 书籍章节中定义的着色器。当我尝试使用预定义的着色器程序时,glUseProgram 返回错误 1282。
可以在给定的 OpenGL 书籍链接中找到着色器代码。我创建纹理的代码如下:
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;
}
【问题讨论】:
-
您使用的代码已弃用。请看this decent, up-to-date tutorial
-
永远不要使用固定功能管道。
-
@Bartek:奇怪的是,他正在使用最新的教程。该教程不包括任何已删除的功能。所以他一定是抄袭了其他教程中的代码。
标签: opengl opencv textures shader augmented-reality