2012-10-17 4 views
3

부울 유니폼을 전달하는 대신 별도의 셰이더를 사용하여 코드를 전환하여 사용할 알고리즘을 결정했습니다. 불행히도, 활발한 테스트를 거친 후에, 속성 중 하나 (후광)가 새로운 쉐이더를 통과하지 않는다는 것을 발견했습니다. 그러나 다른 속성 (위치) 은 통과했지만입니다.셰이더에 전달되지 않는 꼭지점 특성

Abdridged 코드는 다음과 같습니다

Java code: 
    // Attributes 
    protected static int position = 0; 
    protected static int colour = 1; 
    protected static int texture = 2; 
    protected static int halo = 3; 
    protected static int normal = 4; 

    protected static int program1; 
    protected static int program2; 

    ... 

    // Linking shader1 
    GLES20.glBindAttribLocation(program1, position, "position"); 
    GLES20.glBindAttribLocation(program1, colour, "colour"); 
    GLES20.glBindAttribLocation(program1, texture, "texCoord"); 
    GLES20.glBindAttribLocation(program1, normal, "normal"); 

    GLES20.glLinkProgram(program1);   

    ... 

    // Linking shader2 
    GLES20.glBindAttribLocation(program2, position, "position"); 
    GLES20.glBindAttribLocation(program2, halo, "halo"); 

    GLES20.glLinkProgram(program2);   

    ... 


    GLES20.glUseProgram(program1); 

    GLES20.glVertexAttribPointer(
     position, 
     3, 
     GLES20.GL_FLOAT, 
     false, 
     0, 
     buffer); 

    ... 

    //Render with program1 

    ... 

    GLES20.glUseProgram(program2); 

    GLES20.glVertexAttribPointer(
     halo, 
     1, 
     GLES20.GL_FLOAT, 
     false, 
     0, 
     doHaloBuffer); 

    GLES20.glEnable(GLES20.GL_BLEND); 
    GLES20.glDisable(GLES20.GL_DEPTH_TEST); 

    ... 

    // Using lines for testing purposes 
    GLES20.glDrawElements(GLES20.GL_LINE_LOOP, haloIndexCount, GLES20.GL_UNSIGNED_SHORT, haloIndexBuffer); 

    ... 

조각 쉐이더는 간단하다 내가 halo > 0.5halo == 0.0로 변경하거나에서 녹색 값을 바꿀 경우 쉐이더

shader1.vsh: 
    attribute vec3 position; 
    attribute vec4 colour; 
    attribute vec2 texCoord; 
    attribute vec3 normal; 

    ... 

    varying vec2 fragTexCoord; 
    varying vec4 fragColour; 

    ... 

    // All attributes used at some point 


shader2.vsh: 
    attribute vec3 position; 
    attribute float halo; 

    varying vec4 fragColour; 

     ... 
     vec4 colour = vec4(1.0, 1.0, 0.0, 1.0); 

     if(halo > 0.5){ 
      colour.g = 0.0; 

     ... 

     } 

     fragColour = colour; 

     ... 

"당신이 얻을 질감과 색상을 렌더링" 위의 명령문은 빨간색이 렌더링되고 그렇지 않으면 노란색이 렌더링됩니다. 테스트를 위해 입력 버퍼를 모두 1.0으로 변경하려고했지만 아무런 차이가 없었습니다. 후광이 (가) 전달되지 않는 것으로 보입니다.

이전에는 두 개의 쉐이더를 병합하여 실행할 코드를 결정하기 위해 부울 유니폼을 사용 했으므로 제대로 작동했습니다. 그 밖의 것은 변하지 않았다. 입력 버퍼가 같고, 카운트가 같아서 지금은 다른 셰이더를 사용하고 있습니다. 의견이 있으십니까?

+0

당신이 프로그램의 두 세트가 같은 속성 인덱스를 사용하는지 확인하기 위해 아무것도하지 않았기 glDrawElements 렌더링하기 전에 사용하는 경우? 왜냐하면 OpenGL이 그것들을 할당하게한다면, 속성 색인이 당신이 할당되기를 원하는 방식으로 할당된다는 보장이 없기 때문입니다. –

+0

@ Nicol Bolas : 네, 그 일을했습니다 (그리고 나는 그걸 포스트에 추가했습니다). 문제가있는 속성은 "halo"이며 shader2에서만 사용됩니다. –

+0

속성을 설정하고'program'을 두 번 연결하는 것처럼 보입니다. 그러나 아무런 속성도 설정하지 않은'program1'과'program2'을 사용합니다 ... –

답변

3

체크 후광 속성이

+0

나는 갑자기 완전한 자식 같아. 그럴 가능성은 그다지 높지 않습니다. 나는 그것을 지금 점검 할 것이다. –

+1

@BenJaguarMarshall * "지금 확인해 보겠습니다"* - 이전 문장의 운 구성과 일치하지 않습니다. 아마도 "* 히트 일 경우 지금 확인해 볼 것입니다. 감사합니다. 그게 완벽했습니다."*) –

관련 문제