2013-02-09 3 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

여기서 달성하고자하는 것이 명확하지 않습니다. 당신이하려고하는 수학은 무엇입니까? –

+0

수학은 color = tex1 + tex2 또는 심지어 color = tex1 + tex2 * 2입니다. – Kenobi

+1

프로그래밍 가능한 파이프 라인 (쉐이더)을 사용 해본 적이 있습니까? 당신과 같은 문제는 그것이 @Kenobi에서 처음 만들어진 이유였습니다. 그래도 색상을 추가하려면 'GL_ADD'가 사용 가능한 작업이어야합니다. –

답변

1

남자들, 마침내 그 목적을위한 셰이더를 작성했습니다! 이상하게도, 나는 마침내 첨가제 블렌딩을 사용하지 않았습니다. (단지 쉐이더에서 한 라인을 변경하여 심각하게 달성)하지만 두 번째 텍스처가 반사적 인 맵이되도록 아이디어를 확장하여 텍스처가 나타날 때만 볼 수 있도록했습니다. 반사 경광등이 닿는다!

효과의 대부분은 내 자신의 쉐이더는 단순히 위의 많은의 반사도 값을 처리 할 수 ​​있다는 사실을 통해 달성 될 수

1 - 악 OpenGL은

GLfloat mat_specular[] ={ 2, 2, 2, 1 }; glMaterialfv(GL_FRONT, GL_SPECULAR,mat_specular); //works here :-) 
:-(묻지 ​​않고 1로 클립 것

꼭지점 쉐이더 :

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

과장 배속 휘성 렌더링. 당신은 빛에 지금 먼지 질감을 볼 수

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

한 질문은 남아있다 -이 땅에 내가 gl_TexCoord를 사용할 수없는 이유 (1) - 결과가 더 질감이 없지만 멀티 텍스처링이없이 잘 작동하지만, 픽셀이 유물을 렌더링 셰이더. 어떤 도움을 주셔서 감사합니다.