0

GLSL でピクセルごとの照明シェーダーを作成しています。写真は立方体のグリッドで、描画される順序に応じて、隠されるべき側面が他の側面の上にレンダリングされます。これは、固定機能の opengl 照明設定に切り替えると問題になりません。何が原因なのですか、どうすれば直せますか?

それはどのようなものか

頂点シェーダー:

varying vec4 ecPos;
varying vec3 normal;

void main()
{ 

gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;

/* first transform the normal into eye space and normalize the result */
normal = normalize(gl_NormalMatrix * gl_Normal);

/* compute the vertex position  in camera space. */
ecPos = gl_ModelViewMatrix * gl_Vertex;


gl_Position = ftransform();

} 

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

varying vec4 ecPos;
varying vec3 normal;

uniform sampler2D tex;
uniform vec2 resolution;

void main()
{
vec3 n,halfV,lightDir;
float NdotL,NdotHV;

vec4 color = gl_LightModel.ambient;
vec4 texC =  texture2D(tex,gl_TexCoord[0].st) * gl_LightSource[0].diffuse;

float att, dist;

/* a fragment shader can't write a verying variable, hence we need
a new variable to store the normalized interpolated normal */
n = normalize(normal);

// Compute the ligt direction
lightDir = vec3(gl_LightSource[0].position-ecPos);

/* compute the distance to the light source to a varying variable*/
dist = length(lightDir);


/* compute the dot product between normal and ldir */
NdotL = max(dot(n,normalize(lightDir)),0.0);

if (NdotL > 0.0) {

    att = 1.0 / (gl_LightSource[0].constantAttenuation +
            gl_LightSource[0].linearAttenuation * dist +
            gl_LightSource[0].quadraticAttenuation * dist * dist);
    color += att * (texC * NdotL + gl_LightSource[0].ambient);


    halfV = normalize(gl_LightSource[0].halfVector.xyz);
    NdotHV = max(dot(n,halfV),0.0);
    color += att * gl_FrontMaterial.specular * gl_LightSource[0].specular *   pow(NdotHV,gl_FrontMaterial.shininess); 

}


gl_FragColor = color;
}

シェーダーは、これらのhttp://www.lighthouse3d.com/tutorials/glsl-tutorial/point-light-per-pixel/の主に変更されたバージョンです。

4

1 に答える 1

5

を有効にするのを忘れている可能性がありGL_DEPTH_TESTます。

glEnable(GL_DEPTH_TEST);さまざまなプリミティブの深さをテストするには、これを有効にした OpenGLを呼び出す必要があります。そのため、OpenGL がレンダリングしているとき、実際に背後にある必要がある他のものの上にランダムにレンダリングすることはありません!

http://www.opengl.org/sdk/docs/man/xhtml/glEnable.xml

于 2013-08-26T12:46:33.353 に答える