0

インターリーブされたステレオスコピック 3D のすべてのフレームをレンダリングするアプリケーションを作成しています。これを実現するために、2 つのフラグメント シェーダーを作成しています。1 つは左目のフレームの奇数行をレンダリングし、もう 1 つは右フレームのピクセルの偶数行をレンダリングします。

私は OSX のビルトイン OpenGL Shader Builder アプリケーションを使用していましたが、すべての奇数行を緑色で正常にレンダリングできました。 OpenGL Shader Builder 奇数行フラグメント シェーダー

ご覧のとおり、使用している frag コードは次のようになります。

    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

4

1 に答える 1

0

2 ピクセルのテクスチャ マスク (偶数ピクセルは黒、奇数 - 白) を使用し、フルスクリーン クワッドの上に並べることで、パフォーマンスをいくらか節約し、互換性を得ることができます (そのうちの 2 つがあります:右目と左目)。反転マスクを使用するか、2 番目のクワッドに座標オフセットを配置します。一般に、次のようになります。

(視覚化のためにパースペクティブと巨大なギャップが追加されました) ここに画像の説明を入力

シーン テクスチャ (またはあなたが持っているもの) をクワッドに配置し、マスク カラーを使用してフラグメントまたは透明度を破棄します。2 つの g-buffer (GPU メモリ) を使用しないようにするには、1 つの目のフル シーンをテクスチャでレンダリングし、別の目のビューでフル シーンをレンダリングし、その上に最初のシーン テクスチャと透明度マスクを使用してフルスクリーン クワッドをレンダリングします。または、2 つの出力が必要な場合は、それらを別々にレンダリングします。


要点は、テクスチャ座標に基づく論理演算の代わりにマスキングを使用する必要があるということです。

于 2012-11-14T03:41:21.147 に答える