2

次のOpenGL関数を見てください。

void glTexImage2D(GLenum    target,
                  GLint     level,
                  GLint     internalFormat,
                  GLsizei   width,
                  GLsizei   height,
                  GLint     border,
                  GLenum    format,
                  GLenum    type,
                  const GLvoid * data);

パラメータのフォーマットとタイプが画像データのフォーマットとタイプを記述していることは知っていますが、プラメータのinternalFormatがわかりません。アプリケーションでその値をどのように設定すればよいですか?

たとえば、次のようなテクスチャを作成します。

glTexImage2D(GL_TEXTURE_2D,0,GL_LUMINANCE8,size,size,0,GL_LUMINANCE,GL_UNSIGNED_BYTE,buffer);

GLSLシェーダーでテクスチャをエースすると、取得する値は[0,1]の間にあるように見えます。なぜですか?[0,255]の間にあるべきではありませんか?

私のシェーダーコードの一部は:

vec = EntryPoint + delta_dir * texture(noiseTex,EntryPoint.xy * 32).x;

私のC++コードの一部:

for (int i = 0;i < temp;++i)
    {
        buffer[i] = 255.0 * rand() / (float)RAND_MAX;
    }
    glGenTextures(1,&noiseTex);
    glActiveTexture(GL_TEXTURE0 + activeTexUnit);
    glBindTexture(GL_TEXTURE_2D,noiseTex);
    glTexImage2D(GL_TEXTURE_2D,0,GL_LUMINANCE8,size,size,
                            0,GL_LUMINANCE,GL_UNSIGNED_BYTE,buffer);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
4

2 に答える 2

19

およびパラメータは、ピクセル転送操作の一部としてOpenGLに渡すデータを記述しformatます。テクスチャの形式について説明します。あなたはOpenGLに、Xのように見えるテイクを与えることを伝えています。OpenGLは、データがYであるテクスチャにそれを格納することです。これは「Y」です。typeinternalformatinternalformat

GL_LUMINANCE8内部形式は、正規化された符号なし整数形式を表します。これは、データが概念的に浮動小数点であるが、圧縮の手段として正規化された整数形式で格納されることを意味します。

さらに言えば、formatofGL_LUMINANCEは、浮動小数点データまたは正規化された整数データのいずれかを渡しtypeていることを示しています(は、正規化された整数データであることを示しています)。もちろん、整数の内部形式で使用する整数GL_LUMINANCE_INTEGERデータを渡すという方法はないので、このような輝度データを実際に使用することはできません。

テクスチャに8ビットの符号なし整数が本当に必要な場合はGL_RED_INTEGER、フォーマットおよび内部フォーマットに使用します。整数テクスチャのサポートには、OpenGL3.xクラスのハードウェアが必要であることに注意してください。GL_R8UI

そうは言っても、整数テクスチャでは使用できません。sampler2D符号なし整数テクスチャフォーマットを使用するテクスチャを使用している場合は、を使用する必要がありますusampler2D

于 2012-10-24T01:48:20.850 に答える
1

値が内部でどのように格納されるかは、GLSLで値にアクセスする方法と必ずしも関係がありません。正規化された色の値(0-1)を使用すると、実際にははるかに簡単になります。ピクセルシェーダーのピクセル値を(0〜255)の範囲で操作したい理由はありますか?

于 2012-10-24T01:47:16.313 に答える