2012-01-22 4 views
5

쉐이더에 문제가 있습니다. glsl을 사용하여 게임에 질감과 퐁 음영을 넣으려고하지만 좋은 효과를 얻을 수 없습니다.glsl에서 phong과 텍스처를 모두 사용합니다.

저는 오랫동안 Google을 검색해 왔으며, 어떻게 가벼운 감촉과 질감을 함께 연결했는지 알 수 없으므로 여기에서 글을 쓰고 질문하기로했습니다.

이 텍스처없이 내 게임 : without texture

을 그리고 이것은 텍스처입니다 :

with texture

내가 실현하려 원하는 것은이 분홍빛이 도는 텍스처가에 자리 더 잘 볼 수 있도록 만드는 것입니다 center - 텍스쳐가없는 것처럼, 거터에있는 버텍스 쉐이딩을 수리합니다. - 픽셀 쉐이딩마다 확인합니다. 지금은 무엇이 잘못 됐는지 알지 못합니다.

퐁 쉐이딩으로 약 10 개의 쉐이더를 확인했으며, 픽셀 쉐이딩이 아닌 정점별로도 있습니다.

내 조각 버텍스 코드입니다. 누군가가 뭔가를 볼 수 있습니까?

varying vec3 N; 
    varying vec3 v; 
    uniform sampler2D myTexture; 

    varying vec2 vTexCoord;  

    void main (void) 
    { 
     vec4 finalColor = vec4(0.0, 0.0, 0.0, 0.0); 

vec3 L = normalize(gl_LightSource[0].position.xyz - v); 
      vec3 E = normalize(-v); // we are in Eye Coordinates, so EyePos is (0,0,0) 
      vec3 R = normalize(-reflect(L,N)); 

      //calculate Ambient Term: 
      vec4 Iamb = gl_FrontLightProduct[0].ambient;  

      //calculate Diffuse Term: 
      vec4 Idiff = gl_FrontLightProduct[0].diffuse * max(dot(N,L), 0.0);  

      // calculate Specular Term: 
      vec4 Ispec = gl_FrontLightProduct[0].specular 
         * pow(max(dot(R,E),0.0),0.3*gl_FrontMaterial.shininess); 

      finalColor+=Iamb + Idiff + Ispec; 
     // write Total Color: 
     gl_FragColor = gl_FrontLightModelProduct.sceneColor + (texture2D(myTexture, vTexCoord)) + finalColor; 
    } 

내 버텍스 쉐이더

varying vec3 N; 
varying vec3 v; 
varying vec2 vTexCoord; 

void main(void) 
{ 

    v = vec3(gl_ModelViewMatrix * gl_Vertex);  
    N = normalize(gl_NormalMatrix * gl_Normal); 
    vTexCoord = vec2(gl_MultiTexCoord0); 

    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; 


} 

나는 도움을 드리겠습니다.

편집 :

이 내가 쉐이더로 내 질감을 넣어하는 방법이다. 셰이더에서 텍스처 값을 편집 할 수 있기 때문에 괜찮습니다. (저는 생각합니다).

int my_sampler_uniform_location = glGetUniformLocation(brickProg, "myTexture"); 

glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, texture); 

glUniform1i(my_sampler_uniform_location,0); 
CUTIL::drawBox(); 
glBindTexture(GL_TEXTURE_2D,0); 

편집 2 :

색상에 대한 니콜 올가미 제안은 내 쉐이더를 편집하고 다음과 같이 변경 한 추가 한 후

:

gl_FragColor = (texture2D (myTexture, vTexCoord)) + finalColor;

이제는 밝았지만 지금은 무대에서 약간의 빛을 켄지해야하며 위대 할 것입니다. 하지만 여전히 픽셀 쉐이딩 당 하나의 버텍스 쉐이딩 당 얻지 못했습니다. 이것은 나의 현재 화면이고 나는 음영에 대해 얘기 무슨 뜻인지 예에 표시 한 :

enter image description here

+0

GL 텍스처 좌표를 설정하고 전달하는 코드를 표시 할 수 있습니까? –

+0

@ MārtiņšMožeiko 편집 및 추가 – sebap123

+0

조명없이 텍스처를 렌더링하면 어떻게됩니까? –

답변

11

이 방정식 :

gl_FragColor = gl_FrontLightModelProduct.sceneColor + (texture2D(myTexture, vTexCoord)) + finalColor; 

대부분의 텍스처에 대한 이해가되지 않습니다. 조명 방정식에서 생성 된 색상을 가져 와서 텍스처에서 샘플링 한 색상에 추가하고 있습니다. 텍스처에 저장된 값이 빛의 을 나타내면 서페이스의 속성이 인 경우에만 의미가 있습니다.

일반적으로 텍스처의 색상 값은 표면의 확산 반사율을 나타냅니다. 즉, 조명 방정식에 직접 반영해야합니다.텍스처의 색상은 재료의 확산 색상을 완전히 대체하거나 어떤 방식으로 재료 확산 색상과 결합해야합니다.

+1

확산 색상을 확산 텍스처 색상과 결합하는 방법은 무엇입니까? 추가 되었습니까? 곱해 졌나요? 다른 것? 앰비언트 및 스페 큘러 텍스처에 대해 동일합니까? – Kerndog73

관련 문제