フラグメントシェーダーで2D配列を処理しようとしています。そのため、配列の作成を開始しました。
int const _s = 512;
std::array<GLubyte,_s*_s*4> hitmap;
for(unsigned j = 0; j < _s; j++) {
for(unsigned i = 0; i < _s; i+=4) {
hitmap[i+j*_s] = j%256; //R
if(j>33 && j < 45) hitmap[i+j*_s] = 0; //R
hitmap[i+j*_s+1] = i%256; //G
if(i>33 && i < 45) hitmap[i+j*_s+1] = 0; //G
hitmap[i+j*_s+2] = 0; //B
hitmap[i+j*_s+3] = 255; //A
}
}
そして最初のステップとして、それをテクスチャとして押して、表面に表示します。
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, _s, _s, 0, GL_RGBA, GL_UNSIGNED_BYTE, hitmap.data());
正方形を取得するために、次の座標で2つの三角形を描画しています。
// positions // texture coords
1.f, 1.f, 0.0f, 1.0f, 1.0f, // top right
1.f, -1.f, 0.0f, 1.0f, 0.0f, // bottom right
-1.f, -1.f, 0.0f, 0.0f, 0.0f, // bottom left
-1.f, 1.f, 0.0f, 0.0f, 1.0f // top left
そして、私のフラグメントシェーダーはかなりばかげています:
#version 150 core
uniform sampler2D ourTexture;
out vec4 FragColor;
in vec2 TexCoord;
void main()
{
FragColor = texture(ourTexture, TexCoord);
};
(はい、ここではかなり古いバージョンを使用しています:/)
私が得る結果は次のとおりです。
上部に奇妙なものがいくつかあり、テクスチャが繰り返されているようです(ただし、ミラーリングされていません)。何が間違っているのか真剣に理解できません。十分なデータが提供されていないようです。mod分割を介して512ピクセルを256の範囲にマッピングしている場合、2x2の正方形のパターンが得られると思います。
編集:このように:
あなたはの概念を誤解しましたGL_MIRRORED_REPEAT
。OpenGLwikiを参照してくださいglTexParameter
GL_MIRRORED_REPEAT
sの整数部分が偶数の場合、s座標はテクスチャ座標の小数部分に設定されます。sの整数部分が奇数の場合、sテクスチャ座標は1-frac(s)に設定されます。ここで、frac(s)はsの小数部分を表します。
これは、テクスチャ座標が[1.0、2.0]、[3.0、4.0]、...の範囲にある場合、テクスチャがミラーリングされることを意味します。テクスチャ座標が[0.0、1.0]、[2.0、3.0]、...の範囲にある場合、ミラーリングされません。
すべてのテクスチャ座標が[0.0、1.0]の範囲にあるため、何もミラーリングされません。
フラグメントシェーダーでテクスチャ座標をスケーリングして、次の概念を確認しますGL_MIRRORED_REPEAT
。
void main()
{
FragColor = texture(ourTexture, TexCoord * 2.0);
};
内部for
ループの条件ステートメントにも誤りがあります。内側のループは、form toではなく0
toから実行する必要があります:_s*4
0
_s
for(unsigned i = 0; i < _s; i+=4) {
for(unsigned i = 0; i < _s*4; i+=4) {
バイト単位でのラインのサイズは_s*4
ありません_s
。
int const _s = 512;
std::array<GLubyte,_s*_s*4> hitmap;
for(unsigned j = 0; j < _s; j++) {
for(unsigned i = 0; i < _s*4; i+=4) {
hitmap[i + j*_s*4] = j%256; //R
if(j>33 && j < 45) hitmap[i + j*_s*4] = 0; //R
hitmap[i + j*_s*4 + 1] = i%256; //G
if(i>33 && i < 45) hitmap[i + j*_s*4 + 1] = 0; //G
hitmap[i + j*_s*4 + 2] = 0; //B
hitmap[i + j*_s*4 + 3] = 255; //A
}
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加