2016-08-24 15 views
0

シェーダを使用してモデルに非常に単純なライティングエフェクトを追加したいと思います。私はそこに頂点およびOpenGL上で作業を行い、フラグメントシェーダが見つかりました:OpenGL ES20のライティングエフェクトの頂点シェーダとフラグメントシェーダ

static const char* vertSource = { 
    "uniform vec3 lightPosition;\n" 
    "varying vec3 normal, eyeVec, lightDir;\n" 
    "void main()\n" 
    "{\n" 
    " vec4 vertexInEye = gl_ModelViewMatrix * gl_Vertex;\n" 
    " eyeVec = -vertexInEye.xyz;\n" 
    " lightDir = vec3(lightPosition - vertexInEye.xyz);\n" 
    " normal = gl_NormalMatrix * gl_Normal;\n" 
    " gl_Position = ftransform();\n" 
    "}\n" 
}; 

static const char* fragSource = { 
    "uniform vec4 lightDiffuse;\n" 
    "uniform vec4 lightSpecular;\n" 
    "uniform float shininess;\n" 
    "varying vec3 normal, eyeVec, lightDir;\n" 
    "void main (void)\n" 
    "{\n" 
    " vec4 finalColor = gl_FrontLightModelProduct.sceneColor;\n" 
    " vec3 N = normalize(normal);\n" 
    " vec3 L = normalize(lightDir);\n" 
    " float lambert = dot(N,L);\n" 
    " if (lambert > 0.0)\n" 
    " {\n" 
    " finalColor += lightDiffuse * lambert;\n" 
    " vec3 E = normalize(eyeVec);\n" 
    " vec3 R = reflect(-L, N);\n" 
    " float specular = pow(max(dot(R, E), 0.0), shininess);\n" 
    " finalColor += lightSpecular * specular;\n" 
    " }\n" 
    " gl_FragColor = finalColor;\n" 
    "}\n" 
}; 

私はAndroidアプリを開発していますので、問題は、私は、OpenGL ES2で働いていますということです。そして、この行でコンパイルが失敗しているため、組み込み変数gl_FrontLightModelProductはGLES20では使用できないようです。

私の質問はこうです:上記のシェーダーをOpenGL ES20のコンテキストで動作させるために、どのように変更できますか?

+0

レガシーOpenGLで利用可能な、事前定義された状態変数へのすべての参照を取り除かなければなりません。これは私の答えとよく似ています:http://stackoverflow.com/questions/24416589/glsl-using-custom-output-attribute-instead-of-glposition。それがデスクトップのコアプロファイルに移行していく中で、OpenGL ESのために必要なことは非常に似ています。 –

+0

あなたの答えは非常に有益です。ありがとう!! – user3417052

答えて

1

gl_FrontLightModelProduct.sceneColor光の影響を受けない領域を完全に黒くしたい場合は、シーンのアンビエント色を0にすることができます。 vec4(0.0, 0.0, 0.0, 1.0);

また、これらの変数を削除して制服として送信する必要があります。

  1. gl_ModelViewMatrix(均一として送信)
  2. gl_Vertex(属性からこれを読んで)
  3. gl_NormalMatrix(均一として送信)
  4. gl_Normal(属性からこれを読んで)

またはその代わりのOpenGLシェーダの変換で戦う場合、Simple OpenGL ES 2.0シェーダを検索できます

+0

gl_FrontLightModelProduct.sceneColorをvec4(0.0、0.0、0.0、1.0)に置き換えて、最初の提案でちょうど私が望むものを得ました。ほんとありがと !! gl_ModelViewMatrixなどを削除する必要はありませんでした。今私は好奇心が強いです、なぜそれは機能しましたか? – user3417052

+0

OpenGL ES 2.0では、どのようにコンパイルされるのか、gl_ModelViewMatrixなどはわかりません。おそらくそれは実装に依存します。あなたはこれらの制服をあなたのコードのどこかに宣言して渡しています。 – codetiger

+0

おそらく実装です。あなたがシェイダーから見ることができるように、彼らは制服として宣言されていません – user3417052

関連する問題