C ++符号なしバイト配列からのOpenGL2DTexture

user3895986

フラグメントシェーダーで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の正方形のパターンが得られると思います。

編集:このように:

期待されるパターン

Rabbid76

あなたはの概念を誤解しましたGL_MIRRORED_REPEATOpenGLwikiを参照してくださいglTexParameter

GL_MIRRORED_REPEATsの整数部分が偶数場合、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ではなく0toから実行する必要があります_s*40_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]

編集
0

コメントを追加

0

関連記事

分類Dev

C ++関数から符号なしバイトを返す

分類Dev

c#画像からバイト配列への巨大なサイズ

分類Dev

C#コードのJavaへの移行、符号なしshortおよびバイト配列変換

分類Dev

ファイルのC#とJavaの間で符号なしバイト配列を読み書きするにはどうすればよいですか?

分類Dev

c#UTF8バイト配列からのGetStringがphpchr関数と等しくない

分類Dev

Cのバイト配列から14ビット値を抽出します

分類Dev

C / C ++の16進文字*からバイト配列

分類Dev

C ++バイト配列からintへ

分類Dev

バイト配列からC#の別のバイト配列の特定の位置にバイトをコピーします

分類Dev

バイト配列からC#の別のバイト配列の特定の位置にバイトをコピーします

分類Dev

C#-配列初期化子を使用して、あるバイト配列を別のバイト配列から構築できますか?

分類Dev

バイト配列C#から特定のバイトを読み取る

分類Dev

C#の0と1の間のランダムなバイト配列からランダムなdouble(浮動小数点)値を取得しますか?

分類Dev

バイト配列をc ++からc#にピンボークします

分類Dev

XamarinでC#を使用したバイト配列からイメージへ

分類Dev

バイト配列をc ++からc#に渡す(mono)

分類Dev

vb.netのC ++ DLLラッパーバイト配列のバイト配列を渡しますか?

分類Dev

C#バイト配列からバイトを抽出する方法は?既知の開始バイト

分類Dev

PythonからCへのバイト文字列の受け渡し

分類Dev

GoコードからのC void *バイト配列の変更

分類Dev

16進文字列からバイト配列C#

分類Dev

JavaプログラムからC ++にバイト配列を送信します

分類Dev

バイト パラメータの配列を使用して Delphi から C# DLL を呼び出す

分類Dev

C unsigned intが2バイトしかかからないのはどうしてですか?

分類Dev

JavaおよびC#-長い変換の違いからバイト配列

分類Dev

変更のためにUnityからAndroid(C ++)にバイト配列を渡す

分類Dev

ビッグエンディアンバイト配列に不可欠なC#符号付きおよび符号なし、およびその逆、「最高の」パフォーマンスでビット単位の方法を使用

分類Dev

C ++からC#:3要素のバイトポインタの配列に相当するもの

分類Dev

配列からのCでのバイナリ加算

Related 関連記事

  1. 1

    C ++関数から符号なしバイトを返す

  2. 2

    c#画像からバイト配列への巨大なサイズ

  3. 3

    C#コードのJavaへの移行、符号なしshortおよびバイト配列変換

  4. 4

    ファイルのC#とJavaの間で符号なしバイト配列を読み書きするにはどうすればよいですか?

  5. 5

    c#UTF8バイト配列からのGetStringがphpchr関数と等しくない

  6. 6

    Cのバイト配列から14ビット値を抽出します

  7. 7

    C / C ++の16進文字*からバイト配列

  8. 8

    C ++バイト配列からintへ

  9. 9

    バイト配列からC#の別のバイト配列の特定の位置にバイトをコピーします

  10. 10

    バイト配列からC#の別のバイト配列の特定の位置にバイトをコピーします

  11. 11

    C#-配列初期化子を使用して、あるバイト配列を別のバイト配列から構築できますか?

  12. 12

    バイト配列C#から特定のバイトを読み取る

  13. 13

    C#の0と1の間のランダムなバイト配列からランダムなdouble(浮動小数点)値を取得しますか?

  14. 14

    バイト配列をc ++からc#にピンボークします

  15. 15

    XamarinでC#を使用したバイト配列からイメージへ

  16. 16

    バイト配列をc ++からc#に渡す(mono)

  17. 17

    vb.netのC ++ DLLラッパーバイト配列のバイト配列を渡しますか?

  18. 18

    C#バイト配列からバイトを抽出する方法は?既知の開始バイト

  19. 19

    PythonからCへのバイト文字列の受け渡し

  20. 20

    GoコードからのC void *バイト配列の変更

  21. 21

    16進文字列からバイト配列C#

  22. 22

    JavaプログラムからC ++にバイト配列を送信します

  23. 23

    バイト パラメータの配列を使用して Delphi から C# DLL を呼び出す

  24. 24

    C unsigned intが2バイトしかかからないのはどうしてですか?

  25. 25

    JavaおよびC#-長い変換の違いからバイト配列

  26. 26

    変更のためにUnityからAndroid(C ++)にバイト配列を渡す

  27. 27

    ビッグエンディアンバイト配列に不可欠なC#符号付きおよび符号なし、およびその逆、「最高の」パフォーマンスでビット単位の方法を使用

  28. 28

    C ++からC#:3要素のバイトポインタの配列に相当するもの

  29. 29

    配列からのCでのバイナリ加算

ホットタグ

アーカイブ