2011-09-26 4 views
0

버텍스 쉐이더를 사용하여 투영을 구현하려고합니다.같은 프로그램에서 여러 버텍스 쉐이더 사용하기

처리 할 별도의 버텍스 쉐이더를 사용하여 gl_Position을 설정하고 프래그먼트 쉐이더에 필요한 값을 설정하는 다른 버텍스 쉐이더가있는 방법이 있습니까?

문제점 첫 번째 버텍스 쉐이더의 main() 함수 만 호출된다는 문제가 있습니다.

편집 : 여러 독립 셰이더를 사용하는 대신 셰이더 소스를 결합하여 작동하도록하는 방법을 찾았습니다. 이 방법이 최선의 방법인지 확실하지 않지만 잘 작동하는 것 같습니다.

main_shader.vsh

attribute vec4 src_color; 

varying vec4 dst_color; // forward declaration 

void transform(void); 

void main(void) 
{ 
    dst_color = src_color; 
    transform(); 
} 

transform_2d.vsh

attribute vec4 position; 

void transform(void) 
{ 
    gl_Position = position; 
} 

는 다음과 같은 사용 :

char merged[2048]; 
strcat(merged, main_shader_src); 
strcat(merged, transform_shader_src); 
// create and compile shader with merged as source 
+0

컨텍스트에 따라 다른 셰이더를 사용한다고 생각할 수있는 유일한 방법은 자주 사용하는 셰이더 프로그램을 전환하는 것입니다 ([glUseProgram'] (http://www.opengl.org/sdk/docs/man3/). xhtml/glUseProgram.xml)). – darvids0n

+2

셰이더를 수동으로 연결하지 않아도됩니다. 'glShaderSource'가 대신 해 주므로,'count' 인수로 2를, 문자열 인수 ('char **')를'string' 인수로, array length ('int *')는'length' 인자로 사용됩니다. – Triang3l

답변

1

을 OpenGL은 ES에, 유일한 방법은 쉐이더 소스를 연결하는 것입니다, 하지만 OpenGL에서는 원하는 것을 할 수있는 몇 가지 흥미로운 기능이 있습니다 :

GL_ARB_shader_subroutine (OpenGL을 4.0 코어의 일부) - 즉 거의 당신이

GL_ARB_separate_shader_objects (OpenGL을 4.1 코어의 일부를) 원하는 것을 수행 -이 확장은 다양한에서 (혼합) 정점과 프래그먼트 쉐이더를 사용할 수 있습니다 따라서 하나의 정점 셰이더와 여러 개의 조각 셰이더 (예 : 다른 효과를 위해),이 확장은 당신을위한 것입니다.

나는 약간 허술하다는 것을 인정하지만, 알고있는 것이 좋다고 생각한다 (누군가에게 유용 할 수도있다).

+0

감사합니다. 나는 그것을 조사 할 것이다. – sharvey

관련 문제