我正在编写一个应用程序,它渲染交错的立体3d中的每一帧。为了实现这一点,我正在编写两个片段着色器:一个用于渲染左眼的帧的奇数行,另一个用于渲染右帧的偶数行像素。
我使用的是OSX内置的OpenGL Shader Builder应用程序,我能够成功地将每个奇数行渲染为绿色:
正如您所看到的,我使用的碎片代码如下所示:
void main(){
if ( mod(gl_FragCoord.y - 0.5, 2.0) == 1.0){
gl_FragCoord = vec4(0.0, 1.0, 0.0, 1.0);
}
}
但是,我写了一个小的OpenGL应用程序来测试这个着色器(顺便说一句,这是NVIDIA OpenGL 2.1,OSX 10.6.8):
#include <iostream>
#include <stdio.h>
#ifdef __APPLE__
#include <OpenGL/gl.h>
#include <OpenGL/glu.h>
#include <GLUT/glut.h>
void DrawGLScene(){
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glFlush();
glutSwapBuffers();
}
void Shading(){
//Fragment shader we want to use
GLuint oddRowShaderId = glCreateShader(GL_FRAGMENT_SHADER);
std::cout << "Creating the fragment shader with id " << oddRowShaderId << std::endl;
const GLchar *source[] =
{ "void main(){ \n",
" if (mod(gl_FragCoord.y-0.5, 2.0) == 0.0){\n",
" gl_FragColor = vec4( 0.0, 1.0, 0.0, 1.0 );\n",
//" gl_BackColor = vec4( 0.0, 1.0, 0.0, 1.0 );\n"
" }\n",
"}\n"
};
std::cout << "Shader source:\n" << source[0] << source[1] << source[2] << source[3] < < source[4] << std::endl;
std::cout << "Gathering shader source code" << std::endl;
glShaderSource(oddRowShaderId, 1, source, 0);
std::cout << "Compiling the shader" << std::endl;
glCompileShader(oddRowShaderId);
std::cout << "Creating new glCreateProgram() program" << std::endl;
GLuint shaderProgramId = glCreateProgram(); //Shader program id
std::cout << "Attaching shader to the new program" << std::endl;
glAttachShader(shaderProgramId, oddRowShaderId); //Add the fragment shader to the program
std::cout << "Linking the program " << std::endl;
glLinkProgram(shaderProgramId); //Link the program
std::cout << "Using the shader program for rendering" << std::endl;
glUseProgram(shaderProgramId); //Start using the shader
}
void keyboard(int key, int x, int y){
switch(key){
case 's':
Shading();
break;
case 'q':
exit(0);
break;
}
}
void idleFunc(){
glutPostRedisplay(); //Redraw the scene.
}
int main(int argc, char** argv){
glutInit(&argc, argv);
glutInitWindowPosition(100, 100);
glutInitWindowSize(1000,1000);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("anaglyph test");
glutDisplayFunc(DrawGLScene);
glutSpecialFunc(keyboard);
glutIdleFunc(idleFunc);
glutMainLoop();
}
这是我从运行代码得到的输出:
我有一种感觉,我可能没有正确编译和glUseProgram
片段着色器。
答案 0 :(得分:0)
你可以节省一些性能并获得一些兼容性,通过使用2像素纹理蒙版(甚至像素是黑色,奇数 - 白色)并将其平铺在全屏四边形上(您将拥有2个),这将减少头痛他们:右眼和左眼)。使用倒置掩模或在第二个四边形上放置一些坐标偏移。一般来说,它看起来像这样:
(为可视化添加了视角和巨大差距)
在四边形上放置场景纹理(或任何你拥有的)并使用蒙版颜色来丢弃碎片或transparency。为避免使用2 g缓冲区(GPU内存),您可以在纹理中为一只眼睛渲染完整场景,在视图中渲染另一只眼睛,并在其上渲染具有第一个场景纹理和透明度蒙版的全屏四边形。 如果您需要两个输出,请将它们分开。
重点是你应该使用遮罩而不是基于纹理坐标的逻辑运算。