2012-03-26 2 views
0

추가 픽셀 별 알파 채널이있는 인덱스가 지정된 그래픽 파일을 표시해야합니다. 또한 언제든지 팔레트를 변경할 수 있는지 확인해야하며 결과 이미지도 변경됩니다. 이를 위해 먼저 소프트웨어 픽셀 사전 계산을 사용했지만 실시간 렌더링에는 너무 느린 속도 였으므로 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에 올바르게로드됩니다).

+0

텍스처 샘플러를 바인딩하지 않았습니다. – kaoD

+0

@kaoD 텍스처 샘플러를 바인딩하고 있습니다 : /GLuint texloc = glGetUniformLocation (aShader_palette, "rec"); glUniform1i (texloc, 0); texloc = glGetUniformLocation (aShader_palette, "rec_colors"); glUniform1i (texloc, 1);/ – ZZYZX

+0

프레임마다 glUniform을 한 번 호출해야합니다. 아마도 glUseProgram을 호출하면 상태가 재설정 될 것입니다. – kaoD

답변

5

glGetError으로 어디에서나 오류를 확인합니까? 당신이 잘못한 일을하고 있다는 것을 나는 믿습니다. glGetUniformLocation은 셰이더가 아닌 연결된 프로그램에 대해 실행되어야합니다. 프로그램이 연결되기 전에 glGetUniformLocation으로 전화를 걸고 있습니다. http://www.opengl.org/wiki/GLAPI/glGetUniformLocation

The actual locations assigned to uniform variables are not known until the program object is linked successfully. After linking has occurred, the command glGetUniformLocation can be used to obtain the location of a uniform variable. Uniform variable locations and values can only be queried after a link if the link was successful.

당신은 항상 최소한 한 번 프레임 당 glGetError와 OpenGL은 오류를 확인해야합니다 개발 과정 :

사람 페이지에서 관련 텍스트를 참조하십시오. 도움을 청하기 위해 온라인 상태가되기 전에 이러한 문제를 알려줍니다.

+0

덕분에 도움이되었습니다. – ZZYZX

관련 문제