0

쉐이더를 통해 내 모델에 매우 단순한 조명 효과를 추가하고 싶습니다.OpenGL ES20의 조명 효과를위한 꼭지점 및 조각 쉐이더

static const char* vertSource = { 
    "uniform vec3 lightPosition;\n" 
    "varying vec3 normal, eyeVec, lightDir;\n" 
    "void main()\n" 
    "{\n" 
    " vec4 vertexInEye = gl_ModelViewMatrix * gl_Vertex;\n" 
    " eyeVec = -vertexInEye.xyz;\n" 
    " lightDir = vec3(lightPosition - vertexInEye.xyz);\n" 
    " normal = gl_NormalMatrix * gl_Normal;\n" 
    " gl_Position = ftransform();\n" 
    "}\n" 
}; 

static const char* fragSource = { 
    "uniform vec4 lightDiffuse;\n" 
    "uniform vec4 lightSpecular;\n" 
    "uniform float shininess;\n" 
    "varying vec3 normal, eyeVec, lightDir;\n" 
    "void main (void)\n" 
    "{\n" 
    " vec4 finalColor = gl_FrontLightModelProduct.sceneColor;\n" 
    " vec3 N = normalize(normal);\n" 
    " vec3 L = normalize(lightDir);\n" 
    " float lambert = dot(N,L);\n" 
    " if (lambert > 0.0)\n" 
    " {\n" 
    " finalColor += lightDiffuse * lambert;\n" 
    " vec3 E = normalize(eyeVec);\n" 
    " vec3 R = reflect(-L, N);\n" 
    " float specular = pow(max(dot(R, E), 0.0), shininess);\n" 
    " finalColor += lightSpecular * specular;\n" 
    " }\n" 
    " gl_FragColor = finalColor;\n" 
    "}\n" 
}; 

문제는 내가 안드로이드 응용 프로그램을 개발하고 있기 때문에 나는, OpenGL을 ES2하고 있어요 있다는 것입니다 : 내가 거기 정점 및 OpenGL에 작품을 조각 쉐이더를 발견했다. 그리고이 라인에서 컴파일이 실패하기 때문에 내장 변수 gl_FrontLightModelProduct를 GLES20에 사용할 수없는 것 같습니다.

내 질문에 : 어떻게 위의 쉐이더를 수정하여 OpenGL ES20 컨텍스트에서 작동하게 할 수 있습니까?

+0

레거시 OpenGL에서 사용할 수있는 미리 정의 된 상태 변수에 대한 모든 참조를 제거해야합니다. 그것은 내 대답은 여기에 아주 비슷합니다 : http://stackoverflow.com/questions/24416589/glsl-using-custom-output-attribute-instead-of-glposition. 데스크톱 핵심 프로필로 이동하는 동안 OpenGL ES에서해야 할 일은 매우 비슷합니다. –

+0

매우 유익한 답변입니다. 감사 !! – user3417052

답변

1

빛의 영향을받지 않는 영역을 완전히 검게하려면 장면의 주변 색을 0으로 지정할 수 있습니다. 이를 012로 바꿀 수 있습니다 vec4(0.0, 0.0, 0.0, 1.0);

또한 이러한 변수를 제거하고 유니폼으로 보내야합니다.

  1. gl_ModelViewMatrix
  2. gl_NormalMatrix
  3. gl_Normal (속성에서이 읽기) (균일로 전송)
  4. gl_Vertex (속성에서이 읽기)

또는 대신을 (균일로 전송) OpenGL 쉐이더 변환에서 싸우면 Simple OpenGL ES 2.0 쉐이더를 검색 할 수 있습니다

+0

gl_FrontLightModelProduct.sceneColor를 vec4 (0.0, 0.0, 0.0, 1.0)로 대체하여 첫 번째 제안으로 정확히 원하는 것을 얻었습니다. 감사합니다 !! gl_ModelViewMatrix와 다른 것들을 제거 할 필요가 없었습니다. 이제 나는 호기심이 생겼다. 왜 효과가 있었 을까? – user3417052

+0

OpenGL ES 2.0에서 gl_ModelViewMatrix 및 기타를 컴파일하는 방법을 모르겠다. 아마 그것은 구현에 달려 있습니다. 또는 당신은 당신의 코드에서이 유니폼을 선언하고 어딘가에 전달할 것입니다. – codetiger

+0

아마도 구현입니다. 셰이더에서 볼 수 있듯이 유니폼으로 선언되지 않습니다. – user3417052