추가 픽셀 별 알파 채널이있는 인덱스가 지정된 그래픽 파일을 표시해야합니다. 또한 언제든지 팔레트를 변경할 수 있는지 확인해야하며 결과 이미지도 변경됩니다. 이를 위해 먼저 소프트웨어 픽셀 사전 계산을 사용했지만 실시간 렌더링에는 너무 느린 속도 였으므로 GPU 측에서 인덱싱 된 텍스처를 처리 할 쉐이더를 작성하기로 결정했습니다. 문제는 두 번째 텍스처 (rec_colors)가로드되지 않는다는 것입니다 (최소한 샘플러에서 읽은 모든 텍셀은 완전히 비어있는 것처럼 보입니다).조각 쉐이더가 작동하지 않는 텍스처 유닛이 여러 개 있습니다.
Application::Display->GetRC();
glewInit();
if(!GLEW_VERSION_2_0) return false;
char* code_frag = loadCode("shader.frag");
char* code_verx = loadCode("shader.verx");
aShader_palette = glCreateShader(GL_FRAGMENT_SHADER);
//glShaderSource(aShader_palette, 1, &aShaderProgram_palette, NULL);
glShaderSource(aShader_palette, 1, (const GLchar**)&code_frag, NULL);
glCompileShader(aShader_palette);
GLint compiled = 0;
glGetShaderiv(aShader_palette, GL_COMPILE_STATUS, &compiled);
if(!compiled)
{
/* error-handling */
}
GLuint texloc = glGetUniformLocation(aShader_palette, "rec");
glUniform1i(texloc, 0);
texloc = glGetUniformLocation(aShader_palette, "rec_colors");
glUniform1i(texloc, 1);
glsl_palette_Program = glCreateProgram();
glAttachShader(glsl_palette_Program, aShader_palette);
glLinkProgram(glsl_palette_Program);
렌더링 관련 :
glPushAttrib(GL_CURRENT_BIT);
glColor4ub(255, 255, 255, t_a); // t_a is overall alpha of sprite displayed
glUseProgram(glsl_palette_Program); // this one is a compiled/linked shader declared above
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, this->m_SpriteData[idx].texture);
glActiveTexture(GL_TEXTURE1); // at this point, it looks like texture unit is actually changed (I checked that via glGetIntegerv)
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, this->m_PaletteTex);
glTexSubImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, 0, 0, 256, 1, GL_RGBA, GL_UNSIGNED_BYTE, palette); // update possibly changed palette on each render
glActiveTexture(GL_TEXTURE0);
glBegin(GL_QUADS);
glTexCoord2i(0, 0);
glVertex2i(x, y);
glTexCoord2i(0, this->GetHeight(idx));
glVertex2i(x, y+this->GetHeight(idx));
glTexCoord2i(this->GetWidth(idx), this->GetHeight(idx));
glVertex2i(x+this->GetWidth(idx), y+this->GetHeight(idx));
glTexCoord2i(this->GetWidth(idx), 0);
glVertex2i(x+this->GetWidth(idx), y);
glEnd();
glActiveTexture(GL_TEXTURE1);
glUnbindTexture(GL_TEXTURE_RECTANGLE_ARB); // custom macro
glActiveTexture(GL_TEXTURE0);
glUnbindTexture(GL_TEXTURE_RECTANGLE_ARB);
glUseProgram(0);
glPopAttrib();
제로 텍스처로부터
데이터 오른쪽 알파 :)
쉐이더 초기화 관련 코드로 블랙 화상의 결과 정확하게 읽 쉐이더 코드 :
#extension GL_ARB_texture_rectangle : enable
uniform sampler2DRect rec;
uniform sampler2DRect rec_colors;
void main(void)
{
vec4 oldcol = texture2DRect(rec, gl_TexCoord[0].st);
vec4 newcol = texture2DRect(rec_colors, vec2(oldcol.r*255.0, 0.0)); // palette index should be*255 bcs rectangle coordinates aren't normalized
gl_FragColor.rgb = newcol.rgb;
gl_FragColor.a = oldcol.g; // alpha from green part
}
Google 검색을 많이했는데 glUniform1i 호출에서 텍스처 유닛 ID를 고정하여 해결 한 비슷한 게시물이 있지만 절대적으로 정상인 것처럼 보입니다 (적어도 TEXTURE0는 rec에 올바르게로드됩니다).
텍스처 샘플러를 바인딩하지 않았습니다. – kaoD
@kaoD 텍스처 샘플러를 바인딩하고 있습니다 : /GLuint texloc = glGetUniformLocation (aShader_palette, "rec"); glUniform1i (texloc, 0); texloc = glGetUniformLocation (aShader_palette, "rec_colors"); glUniform1i (texloc, 1);/ – ZZYZX
프레임마다 glUniform을 한 번 호출해야합니다. 아마도 glUseProgram을 호출하면 상태가 재설정 될 것입니다. – kaoD