12 비트 YUV 프레임 (YUV420P)을 GLSL 쉐이더가있는 24 비트 RGB 프레임으로 변환하려고합니다. Nvidia 비디오 카드에서 작동하지만 ATI 비디오 카드에서도 작동하지만 올바르지 않습니다. 이미지가 올바르게 그려지지 않습니다. 색상이 다르며 이미지가 전체 크기의 1/4입니다.다른 비디오 카드에있는 GLSL 조각 쉐이더
uniform sampler2DRect y_texture, u_texture, v_texture;
uniform float imageHeight;
void main(void) {
float sx, sy, r, g, b, y, u, v;
sx = gl_TexCoord[0].x;
sy = imageHeight - gl_TexCoord[0].y;
y = texture2DRect(y_texture, vec2(sx/2.0, sy/2.0)).r;
u = texture2DRect(u_texture, vec2(sx/2.0, sy/2.0)).r;
v = texture2DRect(v_texture, vec2(sx/2.0, sy/2.0)).r;
y = 1.1643 * (y - 0.0625);
u = u - 0.5;
v = v - 0.5;
r = y + 1.5958 * v;
g = y - 0.39173 * u - 0.8129 * v;
b = y + 2.017 * u;
gl_FragColor = vec4(r, g, b, 1.0);
}
이 어떻게 수정 (또는 새로 만들기) 할 수 여기에
는 쉐이더의 코드? 당신은 잘못 텍스처를 사용하는
glEnable(GL_TEXTURE_RECTANGLE_ARB);
//FrameHeight
int i_imageHeight = glGetUniformLocation(handleProgram, "imageHeight");
glUniform1f(i_imageHeight, (float)frameHeight);
//U
glActiveTexture(GL_TEXTURE1);
int i_u = glGetUniformLocationARB(handleProgram, "u_texture");
glUniform1iARB(i_u, 1);
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 1);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_LUMINANCE, frameWidth/2, frameHeight/2, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, uFrameData);
//V
glActiveTexture(GL_TEXTURE2);
int i_v = glGetUniformLocationARB(handleProgram, "v_texture");
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 2);
glUniform1iARB(i_v, 2);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_LUMINANCE, frameWidth/2, frameHeight/2, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, vFrameData);
//Y
glActiveTexture(GL_TEXTURE0);
int i_y = glGetUniformLocationARB(handleProgram, "y_texture");
glUniform1iARB(i_y, 3);
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 0);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_LUMINANCE, frameWidth, frameHeight, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, yFrameData);
//Draw
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBegin(GL_QUADS);
glTexCoord2i(0, 0); glVertex2i(0, 0);
glTexCoord2i(frameWidth, 0); glVertex2i(this->width, 0);
glTexCoord2i(frameWidth, frameHeight); glVertex2i(this->width, this->height);
glTexCoord2i(0, frameHeight); glVertex2i(0, this->height);
glEnd();
glFlush();
SwapBuffers(hDC);
"올바르지 않음"을 정의하십시오. – Bart
호스트 코드도 게시하십시오. GL_TEXTURE_RECTANGLE_ARB 대신 GL_TEXTURE_2D를 사용하고 계신지요? – sschuberth
코드를 게시했습니다 ... 셰이더에 또한 : y = texture2DRect (y_texture, vec2 (sx/2.0, sy/2.0)). r; 이 줄은 ATI 카드 용입니다. nVidia 카드에서 : y = texture2DRect (y_texture, vec2 (sx, sy)). r; – Alexander