3

OpenGL 2.1/GLSL 1.2 アプリケーションに頂点シェーダーとフラグメント シェーダーを追加しています。

頂点シェーダー:

#version 120

void main(void)  
{    
    gl_Position = ftransform();
    gl_FrontColor = gl_Color;
}

フラグメント シェーダー:

#version 120

void main(void) 
{   
    if (/* test some condition */) {
        discard;
    } else {
        gl_FragColor = gl_Color;
    }
}

問題は、条件が失敗した場合、gl_FragColor最後の呼び出しgl.glColor3f()が固定関数メソッドにあったものに設定されることです。

代わりに、マテリアルと照明パラメーターから派生した通常の色を通過させたいと考えています。たとえば、次のようになります。

gl.glLightfv(GLLightingFunc.GL_LIGHT0, GLLightingFunc.GL_AMBIENT, lightingAmbient, 0);
gl.glLightfv(GLLightingFunc.GL_LIGHT0, GLLightingFunc.GL_DIFFUSE, lightingDiffuse, 0);
gl.glLightfv(GLLightingFunc.GL_LIGHT0, GLLightingFunc.GL_SPECULAR, lightingSpecular, 0);
gl.glLightfv(GLLightingFunc.GL_LIGHT0, GLLightingFunc.GL_POSITION, directionalLightFront, 0);

gl.glMaterialfv(GL.GL_FRONT, GLLightingFunc.GL_AMBIENT, materialAmbient, 0);
gl.glMaterialfv(GL.GL_FRONT, GLLightingFunc.GL_DIFFUSE, materialDiffuse, 0);
gl.glMaterialfv(GL.GL_FRONT, GLLightingFunc.GL_SPECULAR, materialSpecular, 0);
gl.glMaterialfv(GL.GL_FRONT, GLLightingFunc.GL_EMISSION, materialEmissive, 0);
gl.glMaterialf(GL.GL_FRONT, GLLightingFunc.GL_SHININESS, shininess);

この値を に割り当てる方法はありgl_FragColorますか? それとも、フラグメント シェーダーでライティングを最初から実装する必要がありますか?

(注意してください、私は高度な照明技術を実行しようとしているわけではありません。クリッピングの目的でシェーダーを使用しており、標準の照明方法を使用したいだけです。)

4

1 に答える 1

3

残念ながら、あなたが望むことをする方法はありません。固定関数パイプラインと頂点/ピクセル シェーダーの使用は相互に排他的です。レンダリングする各プリミティブは、いずれかを使用する必要があります。

したがって、シェーダーでライティングの計算を自分で行う必要があります。このチュートリアルでは、そのために必要なすべてのコードを提供します。すべての頂点ではなくすべてのピクセルのライティング計算を行うため、結果は実際にははるかに良く見えます!

于 2013-10-04T20:21:24.063 に答える