繁体   English   中英

OpenGL奇数行片段着色器错误:未绘制

[英]OpenGL Odd Row Fragment Shader Error: Not drawing

我正在编写一个应用程序,该应用程序以交错的立体3d渲染每一帧。 为此,我编写了两个片段着色器:一个用于渲染左眼帧的奇数行,另一个用于渲染右帧像素的偶数行。

我正在使用OSX的内置OpenGL Shader Builder应用程序,并且能够成功地将每个奇数行呈现为绿色: 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正确着色片段着色器的感觉。

您可以节省一些性能并获得一些兼容性,并且通过使用2像素纹理蒙版(即使像素是黑色,奇数-白色)并将其平铺在全屏四边形上(您将拥有两个),可以减少头痛的情况。右眼和左眼)。 使用倒置蒙版或在第二个四边形上放置一些坐标偏移。 一般来说它看起来就像这样:

(为可视化添加了巨大的差距) 在此处输入图片说明

将场景纹理(或您拥有的任何东西)放在四边形上,并使用遮罩颜色丢弃片段或透明度 为了避免使用2个g缓冲区(GPU内存),您可以渲染一只眼睛的整个场景并呈现另一只眼睛的视图,并在其顶部渲染具有第一个场景纹理和透明度蒙版的全屏四边形。 如果需要两个输出,也可以将它们分开。


要点是,您应该使用遮罩而不是基于纹理坐标的逻辑运算。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM