C++ OpenGL立体:在左右纹理之间交替
我正在使用openGL quad buffer渲染立体3D图像(我对openGL非常陌生) 我遇到了一个关于如何为每个后缓冲区定义输出纹理的问题,我认为这是通过定义输出颜色(对应于指定的纹理)在片段缓冲区中完成的 这是我用于着色器源的代码:C++ OpenGL立体:在左右纹理之间交替,c++,opengl,cuda,stereo-3d,C++,Opengl,Cuda,Stereo 3d,我正在使用openGL quad buffer渲染立体3D图像(我对openGL非常陌生) 我遇到了一个关于如何为每个后缓冲区定义输出纹理的问题,我认为这是通过定义输出颜色(对应于指定的纹理)在片段缓冲区中完成的 这是我用于着色器源的代码: // Shader sources const GLchar* vertexSource = "#version 150 core\n" "in vec2 position;" "in vec3 color;" "in vec
// Shader sources
const GLchar* vertexSource =
"#version 150 core\n"
"in vec2 position;"
"in vec3 color;"
"in vec2 texcoord;"
"out vec3 Color;"
"out vec2 Texcoord;"
"void main() {"
" Color = color;"
" Texcoord = texcoord;"
" gl_Position = vec4(position, 0.0, 1.0);"
"}"; // Vertex buffer source
const GLchar* fragmentSource =
"#version 150 core\n"
"in vec3 Color;"
"in vec2 Texcoord;"
"out vec4 outColor;"
"uniform sampler2D texRight;"
"uniform sampler2D texLeft;"
"void main() {"
" outColor = texture(texRight, Texcoord);"
" outColor = texture(texLeft, Texcoord);"
"}"; // Fragment buffer source
这是我用来填充后台缓冲区的代码,我在freeglut上下文窗口的显示函数中使用它
// Clear Buffers
glDrawBuffer(GL_BACK);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearColor(0.0f, 0.0f, 0.0f,1.0f);
cudaGLMapBufferObject((void**)d_glpointer, pbo);
cudaGLMapBufferObject((void**)d_glpointer, pbo_Right);
//...
// Unmap buffer object
cudaGLUnmapBufferObject(pbo);
glBindBuffer( GL_PIXEL_UNPACK_BUFFER, pbo);
glDrawBuffer(GL_BACK_LEFT);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, texturesID[1]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, image_width, image_height, 0, GL_RGBA, GL_UNSIGNED_BYTE,NULL); // NULL specifies that the image is in memory
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glUniform1i(glGetUniformLocation(shaderProgram, "texLeft"), 1);
// Draw a rectangle from the 2 triangles using 6 indices
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
// Unmap buffer object
cudaGLUnmapBufferObject(pbo_Right);
glBindBuffer( GL_PIXEL_UNPACK_BUFFER, pbo_Right);
// Draw Back Buffers
glDrawBuffer(GL_BACK_RIGHT);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texturesID[0]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, image_width, image_height, 0, GL_RGBA, GL_UNSIGNED_BYTE,NULL); // NULL specifies that the image is in memory
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glUniform1i(glGetUniformLocation(shaderProgram, "texRight"), 0);
// Draw a rectangle from the 2 triangles using 6 indices
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
// Swap buffers
glutSwapBuffers();
通过使用这段代码,我只能看到最后定义的outcolor,但我无法找到一种函数方式,根据我使用的缓冲区在outcolor定义之间进行选择
我使用Cuda将图像放入内存,但问题似乎与此映射无关,因为我始终能够看到与着色器outcolor中最后定义的纹理相关的图像
我会很感激你能帮我解决这个问题
编辑1:
我向着色器添加了一个计数器,用于验证帧计数(texCount)是偶数还是奇数。虽然,我现在没有输出图像
#version 150 core
in vec3 Color;
in vec2 Texcoord;
out vec4 outColor;
uniform sampler2D texRight;
uniform sampler2D texLeft;
uniform int texCount=1;
void main() {
if (texCount%2){ // if texCount division by two is exact then this is false
outColor = texture(texLeft, Texcoord);
}else{
outColor = texture(texRight, Texcoord);
}
texCount++;
}
我认为下面的方法应该有效 新片段着色器:
#version 150 core in vec3 Color;
in vec2 Texcoord;
out vec4 outColor;
uniform sampler2D texIndex;
void main() {
outColor = texture(texIndex, Texcoord);
}
然后将代码中的“texLeft”
和“texRight”
替换为“texIndex”
请注意,如果纹理是静态的,则不必在每个帧上载纹理。理想情况下,您可以将所有只需执行一次的命令放在设置功能中,只有当操作系统通知窗口重塑时,您才会执行该功能。如果我理解正确,您希望交替显示两种纹理,即偶数帧上的纹理0和奇数帧上的纹理1?(或者
texLeft
和texRight
)。是的,这正是我想要做的。虽然只显示纹理1(“texleft”)。是否可以在片段着色器中添加一个统一的值,指示必须使用哪个纹理(0或1),并在每帧更新该值(类似于frame\u counter%2
)?我添加了一个标志(GLuint texCount),该标志在glBindBuffer之后从0更改为1,我的片段着色器现在看起来如下所示,但现在没有显示图像:#版本150 core,vec3颜色;在vec2 Texcoord;外显vec4外显色;统一采样器,右对齐;均匀取样器;左;void main()。新着色器使用未定义的变量,因此不会编译。顺便说一句,你应该编辑你的问题以包含任何更改,而不是把它们放在不可能阅读的评论中。非常感谢,它很有魅力。在这种特殊情况下,我将一个目录中的多个图像渲染到纹理中,因此我需要在每个帧上进行纹理上载。您可能需要为outColor
指定一个值,否则此着色器将不会有太大作用。