2012-03-26 12 views
3

12ビットのYUVフレーム(YUV420P)をGLSLシェーダ付きの24ビットRGBフレームに変換しようとしています。 Nvidiaビデオカードで動作していますが、ATIビデオカードでも動作していますが正しく動作しません。画像が正しく描画されません。色は異なり、画像はフルサイズの4分の1です。ここで異なるビデオカード上の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); 
+3

「正しくない」と定義します。 – Bart

+2

また、ホストコードを投稿してください。 GL_TEXTURE_RECTANGLE_ARBの代わりにGL_TEXTURE_2Dを使用していますか? – sschuberth

+0

私はコードを投稿しました...シェーダでも: y = texture2DRect(y_texture、vec2(sx/2.0、sy/2.0))。 ATIカード用のこの行。 nVidiaカードの場合: y = texture2DRect(y_texture、vec2(sx、sy))。r; – Alexander

答えて

0

は、ここでのサンプルコードです。テクスチャオブジェクト(glGenTextures)の作成がどこにも見えません。最初に3つのテクスチャオブジェクトを生成し、それらのオブジェクトをglBindTextureに渡す必要があります。代わりに、0、1、2のインデックスを使用していますが、0も存在しないテクスチャのインデックスであるため、間違っています。私は、0テクスチャの状態を変更しようとすると、OpenGLがエラーコードを表示すると思われます。だから、電話の間にglError()のチェックを追加してください。技術的には、あなたのプログラムはGL上の "未定義の動作"の例なので、さまざまなHW /ドライバの実行の違いを(あなたが修正するまで)期待する必要があります。あなたの参考のために

、テクスチャ管理は次のようになります。

GLuint textures[3]; 
glGenTextures(3,textures); 
... 
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, textures[1]); 
//initialize state of t1 
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, textures[2]); 
//initialize state of t2 
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, textures[0]); 
//initialize state of t0 

glUniformとglActiveTextureへのお電話はまだ正しい注ので、それらを修正する必要はありませんが。

関連する問題