2013-10-04 1 views
3

OpenGL 2.1/GLSL 1.2 응용 프로그램에 버텍스 및 프래그먼트 쉐이더를 추가하고 있습니다.고정 함수 재질과 조명을 조각 쉐이더로 패스 스루하는 방법은 무엇입니까?

버텍스 쉐이더 :

#version 120 

void main(void) 
{  
    gl_Position = ftransform(); 
    gl_FrontColor = gl_Color; 
} 

조각 쉐이더 :

#version 120 

void main(void) 
{ 
    if (/* test some condition */) { 
     discard; 
    } else { 
     gl_FragColor = gl_Color; 
    } 
} 

문제는 조건이 실패 할 경우, gl_FragColor 단지 gl.glColor3f() 마지막 호출 내 고정 기능이었다 무엇으로 설정됩니다 있다는 것입니다 방법.

대신 재료 및 조명 매개 변수에서 파생 된 일반 색상을 통과시키고 싶습니다. 예 :

gl.glLightfv(GLLightingFunc.GL_LIGHT0, GLLightingFunc.GL_AMBIENT, lightingAmbient, 0); 
gl.glLightfv(GLLightingFunc.GL_LIGHT0, GLLightingFunc.GL_DIFFUSE, lightingDiffuse, 0); 
gl.glLightfv(GLLightingFunc.GL_LIGHT0, GLLightingFunc.GL_SPECULAR, lightingSpecular, 0); 
gl.glLightfv(GLLightingFunc.GL_LIGHT0, GLLightingFunc.GL_POSITION, directionalLightFront, 0); 

gl.glMaterialfv(GL.GL_FRONT, GLLightingFunc.GL_AMBIENT, materialAmbient, 0); 
gl.glMaterialfv(GL.GL_FRONT, GLLightingFunc.GL_DIFFUSE, materialDiffuse, 0); 
gl.glMaterialfv(GL.GL_FRONT, GLLightingFunc.GL_SPECULAR, materialSpecular, 0); 
gl.glMaterialfv(GL.GL_FRONT, GLLightingFunc.GL_EMISSION, materialEmissive, 0); 
gl.glMaterialf(GL.GL_FRONT, GLLightingFunc.GL_SHININESS, shininess); 

gl_FragColor에이 값을 할당 할 방법이 있습니까? 아니면 프래그먼트 쉐이더에서 조명을 처음부터 구현해야합니까?

(참고, 나는 고급 조명 기술의 모든 종류의 일을하려고 아니에요. 내가 목적으로 클리핑을위한 쉐이더를 사용하고 단지 표준 조명 방법을 사용하려는거야.)

답변

3

불행하게도 할 수있는 방법이 없습니다 네가 원하는 걸해라. 고정 함수 파이프 라인과 정점/픽셀 쉐이더를 함께 사용하는 것은 상호 배타적입니다. 렌더링하는 각 프리미티브는 둘 중 하나를 사용해야합니다.

따라서 조명 계산은 쉐이더에서 직접 수행해야합니다. This tutorial은 필요한 모든 코드를 제공합니다. 모든 정점 대신 모든 픽셀에 대한 조명 계산을 수행하므로 결과가 실제로 훨씬 좋아집니다!