2013-02-09 51 views
0

我想要一個效果,即具有強烈的太陽反射的金屬表面在光線中幾乎變成白色。它在第一遍(金屬)上進行兩遍渲染和疊加混合第二遍(具有接近白色的紋理和最高鏡面光)時效果很好。opengl中的多紋理添加劑混合

但是,出於性能,我想切換到多重紋理,但目前還沒有這樣的東西作爲添加劑調合而成,原來只有

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); 
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND); 
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 

沒有這些作品作爲添加劑混合的。 :-(

我的第二個問題:?有沒有可能有第二質地比在同一個三角形的第一個紋理更加閃亮看來,使用glMaterial覆蓋其它質地的材料

可能該解決方案可能是一個很好的glTexEnvi - 黑客工具,可以模擬具有很強的光澤質感的效果

+0

目前尚不清楚你想在這裏實現什麼。你試圖做的數學是什麼? – 2013-02-09 23:37:23

+0

數學是color = tex1 + tex2,或者甚至color = tex1 + tex2 * 2 – Kenobi 2013-02-09 23:50:39

+1

您是否考慮過使用可編程流水線(着色器)?像你這樣的問題是它首先在@Kenobi創建的原因。如果你只想添加顏色,'GL_ADD'應該是可用的操作。 – 2013-02-09 23:54:58

回答

1

傢伙,我終於寫一個着色器用於該目的奇怪的是,我終於沒有用添加劑勾兌成功了! (只需更改着色器中的一條線就可以實現這一點),但是擴展了這個想法,以便第二個紋理將成爲高光貼圖 - 這樣紋理將只在鏡面光芒擊中它!

大多數的效果可以通過事實證明我自己的着色器可以簡單地處理一個值鏡面反射的遠高於可實現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);" 
    "}"); 

它沒有任何優化,現在只是一個沒有藝術技巧的概念驗​​證,但結果如下:

渲染時沒有任何着色器,而是「調製」的多紋理。你可以看到一些灰塵的船隻,但可憐的鏡面光:

http://i.stack.imgur.com/8whUC.jpg

與着色渲染 - 污垢雖然有沒有明確對這個鏡頭可以看出。重鏡面光,即甚至可以通過在glMaterialfv上升鏡面性值被strenghtened:

http://i.stack.imgur.com/IpnTa.jpg

渲染用誇張的4倍光澤。現在,您可以看到泥土質感的光芒:

http://i.stack.imgur.com/MPAm3.jpg

還有一個問題 - 爲什麼地球上我不能使用gl_TexCoord(1) - 結果是沒有質感,但像素渲染文物雖然多紋理不工作正常着色器。任何幫助讚賞。