2012-01-11 6 views
4

私は数時間前からこれに対して頭を叩いていましたが、それは単純なものだと確信していますが、結果を得ることはできません。 OpenGL呼び出しをカプセル化するための小さなライブラリを構築したため、このコードを少し編集しなければなりませんでしたが、以下は状態の正確な説明です。OpenGL、Shader Model 3.3テクスチャリング:黒いテクスチャ?

私は、次の頂点シェーダを使用しています:

#version 330 
in vec4 position; 
in vec2 uv; 
out vec2 varying_uv; 
void main(void) 
{ 
    gl_Position = position; 
    varying_uv = uv; 
} 

そして、次のフラグメントシェーダ:

#version 330 
in vec2 varying_uv; 
uniform sampler2D base_texture; 
out vec4 fragment_colour; 
void main(void) 
{ 
    fragment_colour = texture2D(base_texture, varying_uv); 
} 

両シェーダは問題なくコンパイルおよびプログラムのリンク。

私の初期化セクションで

、私はそうのような単一のテクスチャをロード:

// Check for errors. 
kt::kits::open_gl::Core<QString>::throw_on_error(); 

// Load an image. 
QImage image("G:/test_image.png"); 
image = image.convertToFormat(QImage::Format_RGB888); 

if(!image.isNull()) 
{ 
    // Load up a single texture. 
    glGenTextures(1, &Texture); 
    glBindTexture(GL_TEXTURE_2D, Texture); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, image.width(), image.height(), 0, GL_RGB, GL_UNSIGNED_BYTE, image.constBits()); 
    glBindTexture(GL_TEXTURE_2D, 0); 
} 

// Check for errors. 
kt::kits::open_gl::Core<QString>::throw_on_error(); 

あなたは、私はテクスチャをロードするためにはQtを使用していることを確認します。 :: throw_on_error()への呼び出しは、OpenGLで(Error()を呼び出すことによって)エラーをチェックし、例外が発生した場合に例外をスローします。このコードでOpenGLエラーは発生せず、Qtを使用してロードされたイメージは有効です。

// Clear previous. 
glClear(GL_COLOR_BUFFER_BIT | 
    GL_DEPTH_BUFFER_BIT | 
    GL_STENCIL_BUFFER_BIT); 

// Use our program. 
glUseProgram(GLProgram); 

// Bind the vertex array. 
glBindVertexArray(GLVertexArray); 

/* ------------------ Setting active texture here ------------------- */ 

// Tell the shader which textures are which. 
kt::kits::open_gl::gl_int tAddr = glGetUniformLocation(GLProgram, "base_texture"); 
glUniform1i(tAddr, 0); 

// Activate the texture Texture(0) as texture 0. 
glActiveTexture(GL_TEXTURE0 + 0); 
glBindTexture(GL_TEXTURE_2D, Texture); 

/* ------------------------------------------------------------------ */ 

// Draw vertex array as triangles. 
glDrawArrays(GL_TRIANGLES, 0, 4); 
glBindVertexArray(0); 
glUseProgram(0); 

// Detect errors. 
kt::kits::open_gl::Core<QString>::throw_on_error(); 

同様、全くOpenGLのエラーが発生しない、および三角形がscreeen通りに描かれている。

図面は、以下のように行われます。しかし、それは次のようになります。それは私に起こった

Texturing, not as expected.

問題は私のテクスチャ座標に関連させることができます。だから、私は、「グリーン」成分と「赤色」成分、及びtとSを用いて次の画像をレンダリング:

Coloring using st coordinates.

テクスチャ座標が正しく表示され、まだ私はまだの黒い三角形を受けてい運命。私は間違って何をしていますか?

答えて

9

私はあなたのテクスチャオブジェクトの不完全なinitに依存する可能性があると思います。

はMINとMAGフィルタ

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

テクスチャを初期化するようにしてください。また、私は、テクスチャのサイズを確認することをお勧め。それは2のべき乗でない場合は、

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE); 

ブラックテクスチャをCLAMP_TO_EDGEする折り返しモードを設定する必要が周りに、しばしば非常に一般的な問題で、この問題に起因するものです。

チャオ

+0

私はこれが適切ではないと思います。それらが設定されていない場合は、デフォルト値が使用されます –

+0

あなたは、人の中には神です! @VJovic私はまったく同じことを考えました:)。 –

+0

これは私にとっても問題を解決しました。 'GL_TEXTURE_MIN_FILTER'は特に適切なデフォルト値を持たないようです。 – Henk

2

があなたのフラグメントシェーダではあなたはそれがgl_FragColorまたはgl_FragData[…]ではないなら、あなたが適切に指定されたフラグメントデータの場所を設定した自己定義されたターゲット

fragment_colour = texture2D(base_texture, varying_uv); 

に書いていますか?

+0

まあ、gl_FragColorは廃止されているので、gl_FragDataも廃止予定です。 Post 1.2(私は思う)を使用してバッファにバインドする必要があります。私は他のすべてを細かく描画することができますので、私は問題ではないと思います。 –

+0

@LiamM:確かに、偶然、あなたがそれを逃したのかどうか疑問に思っていた。 – datenwolf

関連する問題