2011-12-27 6 views
1

OpenGLを使用してテクスチャを描画しています。OpenGLスケーリングテクスチャ

glClear(GL_COLOR_BUFFER_BIT); 

float w = 128; 
float h = 128; 

w *= scale; 
h *= scale; 

GLfloat vertices[] = { 
    w, 0, 
    w, h, 
    0, 0, 
    0, h 
}; 

float u1 = 0; 
float u2 = 1; 
float v1 = 0; 
float v2 = 1; 

GLfloat texCoords[] = { 
    u2, v1, 
    u2, v2, 
    u1, v1, 
    u1, v2 
}; 

glVertexPointer(2, GL_FLOAT, 0, vertices); 
glEnableClientState(GL_VERTEX_ARRAY); 
glTexCoordPointer(2, GL_FLOAT, 0, texCoords); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

私の問題を説明するのは簡単な例です。私は三角形の頂点にのみ影響するスケール変数を変更し、テクスチャ座標を変更すべきではありません。スケールが1のとき、私はこの絵を持っている:

one http://dl.dropbox.com/u/21467/opengl/1.png

私は150にスケールを変更すると、私はこの絵を持っている:

two http://dl.dropbox.com/u/21467/opengl/3.png

あなたは慎重に見ると、あなたが少しストライプに気付きますテクスチャの上部。それはなぜそこにあり、どうすればそれを避けることができますか?

私の実際のゲームではタイルを描いています。スケールを変えた場合、私のタイルはそのストライプを持ち始めます。その結果、私はゲームでこの厄介な縞模様を得ました。誰が知っている、何が間違っていますか?テクスチャバッファを作成するときに

+1

Googleのキーワード:ピクセル完璧なレンダリング – Kos

答えて

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); 

を注意深く見れば、あなたはテクスチャの上に小さなストライプに気づきます。それはなぜそこにあり、どうすればそれを避けることができますか?何が起こっている

は、特定のピクセルで、テクスチャその画面位置の座標が-0.0001、または1.0002のようなものであってもよいことです。 TEXTURE_WRAP_ [S/T]テクスチャパラメータは、これが発生したときに起こることを詳述します。

+0

ありがとう!ちなみに、定数名はGL_TEXTURE_WRAP_TとGL_TEXTURE_WRAP_Sで、何らかの理由で私はOpenGLにGL_CLAMPしかありません。私はこの問題を発見し、それは私の問題を解決しましたhttp://stackoverflow.com/questions/5617250/gl-clamp-to-edge-was-not-declared-in-this-scope – psyched

+0

私は気づいた、それは動作するGL_NEARESTとGL_LINEARの場合は、まだ画像の周りに境界線があります... – psyched

+0

はい、[glTexParameter notes](http://www.opengl.org/sdk/docs/man/xhtml/glTexParameter.xml#notes)の状態そのGL_CLAMP_TO_EDGEはOpenGL 1.2以降でのみ利用可能です。詳細については、[Windows用OpenGL 1.1を超えた移動](http://www.gamedev.net/page/resources/_/technical/opengl/moving-beyond-opengl-11-for-windows-r1929)を参照してください。 –

1

二時間、今日...

がこの回答を参照してください:

https://stackoverflow.com/a/8643282/524368


をああ、あなたの人々は、問題のためのgoogleことはありませんか?

は、私がここに

https://stackoverflow.com/a/7272871/524368

といくつかの他の場所でもここ

https://stackoverflow.com/a/5879551/524368

とし、それに答え:これはよくある質問のいくつか の並べ替えになっています。

+0

私はあなたに同意しません。私のテクスチャ座標は、左下が常に(0.0,0.0)左上が(1.0,1.0)右上で、ピクセルの辺に対応します。これは、0.0が最小値で1.0がテクスチャ全体の最大値なので、エッジです。 – psyched

+0

@ user1113852:問題は、ピクセルのエッジではなく中心からのエッジが滲み出ないようにすることです。 – datenwolf

+0

私はあなたが正しいと分かっていれば、SとT座標を(0.0,0.0)と(1.0,1.0)ではなく、(0.0 + 1.0/128.0,0.0 + 1.0/128.0)と(1.0 - 1.0/128.0) 1.0〜1.0/128.0)。この場合、白い縞が消えますが、私のテクスチャはぼやけており、縮尺されています。私はその効果を望んでいません。 – psyched