부울 유니폼을 전달하는 대신 별도의 셰이더를 사용하여 코드를 전환하여 사용할 알고리즘을 결정했습니다. 불행히도, 활발한 테스트를 거친 후에, 속성 중 하나 (후광)가 새로운 쉐이더를 통과하지 않는다는 것을 발견했습니다. 그러나 다른 속성 (위치) 은 통과했지만입니다.셰이더에 전달되지 않는 꼭지점 특성
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.5
halo == 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으로 변경하려고했지만 아무런 차이가 없었습니다. 후광이 (가) 전달되지 않는 것으로 보입니다.
이전에는 두 개의 쉐이더를 병합하여 실행할 코드를 결정하기 위해 부울 유니폼을 사용 했으므로 제대로 작동했습니다. 그 밖의 것은 변하지 않았다. 입력 버퍼가 같고, 카운트가 같아서 지금은 다른 셰이더를 사용하고 있습니다. 의견이 있으십니까?
당신이 프로그램의 두 세트가 같은 속성 인덱스를 사용하는지 확인하기 위해 아무것도하지 않았기 glDrawElements 렌더링하기 전에 사용하는 경우? 왜냐하면 OpenGL이 그것들을 할당하게한다면, 속성 색인이 당신이 할당되기를 원하는 방식으로 할당된다는 보장이 없기 때문입니다. –
@ Nicol Bolas : 네, 그 일을했습니다 (그리고 나는 그걸 포스트에 추가했습니다). 문제가있는 속성은 "halo"이며 shader2에서만 사용됩니다. –
속성을 설정하고'program'을 두 번 연결하는 것처럼 보입니다. 그러나 아무런 속성도 설정하지 않은'program1'과'program2'을 사용합니다 ... –