傢伙,我終於寫一個着色器用於該目的奇怪的是,我終於沒有用添加劑勾兌成功了! (只需更改着色器中的一條線就可以實現這一點),但是擴展了這個想法,以便第二個紋理將成爲高光貼圖 - 這樣紋理將只在鏡面光芒擊中它!
大多數的效果可以通過事實證明我自己的着色器可以簡單地處理一個值鏡面反射的遠高於可實現1 - 邪惡的OpenGL將它夾到1不問:-(
GLfloat mat_specular[] ={ 2, 2, 2, 1 }; glMaterialfv(GL_FRONT, GL_SPECULAR,mat_specular); //works here :-)
頂點着色器:
vs = const_cast<char *>(
"varying vec4 diffuse, ambient;"
"varying vec3 normal, lightDir, halfVector;"
"uniform float time;"
"void main(void){"
"normal = normalize(gl_NormalMatrix * gl_Normal);" //Transform Normal into Eye Space
"lightDir = normalize(vec3(gl_LightSource[0].position));"
"halfVector = normalize(gl_LightSource[0].halfVector.xyz);"
"diffuse = gl_FrontMaterial.diffuse * gl_LightSource[0].diffuse;"
"ambient = gl_FrontMaterial.ambient * gl_LightSource[0].ambient + gl_FrontMaterial.ambient * gl_LightModel.ambient;"
"gl_TexCoord[0] = gl_MultiTexCoord0;"
"gl_Position = ftransform();" //Apply Changes
"}") ;
和片段着色器:
fs =const_cast<char *>(
"uniform sampler2D tex1;"
"uniform sampler2D tex2;"
"varying vec4 diffuse,ambient;"
"varying vec3 normal, lightDir, halfVector;"
"void main() {"
"vec3 n,halfV,colortexel,colorfragment;"
"vec4 texel,specularmap;"
"float NdotL,NdotHV,alphatexel,alphafragment;\n"
"colorfragment = ambient.rgb;" //initialize color with ambient part
"alphafragment = gl_FrontMaterial.diffuse.a;"
"n = normalize(normal);" //copy to write
"NdotL = max(dot(normal, lightDir), -0.1);"
"specularmap = texture2D(tex2,gl_TexCoord[0].st);" //MUST Be started first!
"texel = texture2D(tex1,gl_TexCoord[0].st*2.0);"
"if (NdotL>=-0.1) {"
"colorfragment += diffuse.rgb * NdotL;"
"halfV = normalize(halfVector);"
"NdotHV = max (dot(n,halfV),0.0);"
"colorfragment += gl_FrontMaterial.specular.rgb * specularmap.rgb * gl_LightSource[0].specular.rgb * pow(NdotHV, gl_FrontMaterial.shininess);"
"}"
"colortexel = texel.rgb; alphatexel = texel.a;"
"gl_FragColor = vec4(colortexel * colorfragment, alphatexel * alphafragment);"
"}");
它沒有任何優化,現在只是一個沒有藝術技巧的概念驗證,但結果如下:
渲染時沒有任何着色器,而是「調製」的多紋理。你可以看到一些灰塵的船隻,但可憐的鏡面光:
與着色渲染 - 污垢雖然有沒有明確對這個鏡頭可以看出。重鏡面光,即甚至可以通過在glMaterialfv上升鏡面性值被strenghtened:
渲染用誇張的4倍光澤。現在,您可以看到泥土質感的光芒:
還有一個問題 - 爲什麼地球上我不能使用gl_TexCoord(1) - 結果是沒有質感,但像素渲染文物雖然多紋理不工作正常着色器。任何幫助讚賞。
目前尚不清楚你想在這裏實現什麼。你試圖做的數學是什麼? – 2013-02-09 23:37:23
數學是color = tex1 + tex2,或者甚至color = tex1 + tex2 * 2 – Kenobi 2013-02-09 23:50:39
您是否考慮過使用可編程流水線(着色器)?像你這樣的問題是它首先在@Kenobi創建的原因。如果你只想添加顏色,'GL_ADD'應該是可用的操作。 – 2013-02-09 23:54:58