남자들, 마침내 그 목적을위한 셰이더를 작성했습니다! 이상하게도, 나는 마침내 첨가제 블렌딩을 사용하지 않았습니다. (단지 쉐이더에서 한 라인을 변경하여 심각하게 달성)하지만 두 번째 텍스처가 반사적 인 맵이되도록 아이디어를 확장하여 텍스처가 나타날 때만 볼 수 있도록했습니다. 반사 경광등이 닿는다!
효과의 대부분은 내 자신의 쉐이더는 단순히 위의 많은의
반사도 값을 처리 할 수 있다는 사실을 통해 달성 될 수
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);"
"}");
예술적 기술 없이는 전혀 최적화되지 않은 상태의 개념 증명이지만 결과는 다음과 같습니다.
"쉐이더가없는 상태에서 렌더링", "변조"는 멀티 텍스쳐입니다. 당신은 선박에 약간의 먼지를 볼 수 있지만, 가난한 반사 빛 할 수 쉐이더 렌더링
- 분명이 총에 볼 수 아니지만 먼지가 있습니다. 심지어 glMaterialfv의 반사도 값을 상승하여 strenghtened 수 무거운 정반사 광은 :
과장 배속 휘성 렌더링. 당신은 빛에 지금 먼지 질감을 볼 수
한 질문은 남아있다 -이 땅에 내가 gl_TexCoord를 사용할 수없는 이유 (1) - 결과가 더 질감이 없지만 멀티 텍스처링이없이 잘 작동하지만, 픽셀이 유물을 렌더링 셰이더. 어떤 도움을 주셔서 감사합니다.
여기서 달성하고자하는 것이 명확하지 않습니다. 당신이하려고하는 수학은 무엇입니까? –
수학은 color = tex1 + tex2 또는 심지어 color = tex1 + tex2 * 2입니다. – Kenobi
프로그래밍 가능한 파이프 라인 (쉐이더)을 사용 해본 적이 있습니까? 당신과 같은 문제는 그것이 @Kenobi에서 처음 만들어진 이유였습니다. 그래도 색상을 추가하려면 'GL_ADD'가 사용 가능한 작업이어야합니다. –