シェーダを使用してモデルに非常に単純なライティングエフェクトを追加したいと思います。私はそこに頂点および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のコンテキストで動作させるために、どのように変更できますか?
レガシーOpenGLで利用可能な、事前定義された状態変数へのすべての参照を取り除かなければなりません。これは私の答えとよく似ています:http://stackoverflow.com/questions/24416589/glsl-using-custom-output-attribute-instead-of-glposition。それがデスクトップのコアプロファイルに移行していく中で、OpenGL ESのために必要なことは非常に似ています。 –
あなたの答えは非常に有益です。ありがとう!! – user3417052