描画にOpenGLES2を使用するiPhoneアプリに取り組んでいます。通常、テクスチャ座標は0〜1の範囲で定義されていることは知っていますが、読みやすくするために、理想的には0〜1023(TextureAtlasのサイズ)からマッピングしたいと思います。この方法で座標を定義するサンプルコードを見たことがありますが、これを可能にする以前に行われた呼び出しを推測することはできませんでした。 glMatrixMode(GL_TEXTURE)
が関係しているようですが、実装方法がよくわかりません。
私の最終目標は、このようなことを達成することです。ここで、アトラス内で使用するテクスチャは、左上の48pxの正方形にあります。
GLshort texcoords[]={
48,48,
0,48,
48,0,
0,0,
};
glVertexAttribPointer(ATTRIB_TEXTUREPOSITON, 2, GL_SHORT, 0, 0, texcoords);
glEnableVertexAttribArray(ATTRIB_TEXTUREPOSITON);
これはOpenGlES2で可能であることがわかりました。これが私がそれを達成した方法です。
フラグメントシェーダー:
precision mediump float;
varying vec2 v_texCoord;
uniform sampler2D textureSample;
uniform float texScale;
void main()
{
vec2 mult=(2.0*v_texCoord - 1.0)/(2.0*texScale);
gl_FragColor = texture2D(textureSample,mult);
}
Obj-C:
GLshort texCoords[]={
512,512,
0,512,
512,0,
0,0,
};
GLfloat textureWidth = 512.0; //texture size, assumed square, power of 2
texCoordLoc = glGetAttribLocation ( program, "a_texCoord");
GLuint textureScale = glGetUniformLocation ( program, "texScale");
glUniform1f(textureScale, textureWidth);
glVertexAttribPointer ( texCoordLoc, 2, GL_SHORT, GL_FALSE, 0, texCoords);
これがパフォーマンス的にどのように機能するかについて誰かがコメントを持っているなら、私は興味があります。
これは何度か聞かれましたが、リンクが手元にないので、簡単で大まかな説明をします。テクスチャの幅が8ピクセルだとします。
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
^ ^ ^ ^ ^ ^ ^ ^ ^
0.0 | | | | | | | 1.0
| | | | | | | | |
0/8 1/8 2/8 3/8 4/8 5/8 6/8 7/8 8/8
数字はテクスチャのピクセルを示し、バーはテクスチャのエッジを示し、最も近い場合はピクセル間の境界をフィルタリングします。ただし、ピクセルの中心をヒットする必要があります。だからあなたはテクスチャ座標に興味があります
(0/8 + 1/8)/ 2 = 1 /(2 * 8)
(1/8 + 2/8)/ 2 = 3 /(2 * 8)
.。
(7/8 + 8/8)/ 2 = 15 /(2 * 8)
または、より一般的には、N幅のテクスチャのピクセルiの場合、適切なテクスチャ座標は次のとおりです。
(2i + 1)/(2N)
ただし、テクスチャを画面のピクセルと完全に位置合わせする場合は、座標として指定するのはクワッドのピクセルではなく、投影によっては中心ではなく画面のピクセルエッジと位置合わせされる可能性があるため、他のテクスチャが必要になる場合があることに注意してください。座標。
直感的な姿を見つけるのに1時間も無駄にしていますが、意外と誰も描いていません。だから私はしました。
4ピクセルのテクスチャが与えられた場合、正規化されたテクスチャ座標[0,1]、正規化されていないテクスチャ座標[0、幅)、gl_FragCoord [0、幅]は次のようになります。
参照