1

そのため、IDによるピッキングを実装しようとしています。これは、すべての drawArray で異なる一意の ID が均一として設定され、テクスチャの赤いコンポーネントに保存されることを意味します。

16 ビット (65k 要素) で十分すぎるので、short を使用することにしました。uniform 変数は ui しかないことはわかっていますが、とにかく試してみることにしました。

別の質問hereも見つけました。ここで、回答にはショートパンツの小さな例が含まれています

ただし、ここでは、フレーム バッファと 2 つのテクスチャを初期化するコードを示します。

        textures = new int[2];
        fbo = new int[1];

        gl3.glGenTextures(2, textures, 0);
        gl3.glGenFramebuffers(1, fbo, 0);
        /**
         * Depth.
         */
        gl3.glBindTexture(GL3.GL_TEXTURE_RECTANGLE, textures[depth]);

        gl3.glTexParameteri(GL3.GL_TEXTURE_RECTANGLE, GL3.GL_TEXTURE_WRAP_S, GL3.GL_CLAMP_TO_EDGE);
        gl3.glTexParameteri(GL3.GL_TEXTURE_RECTANGLE, GL3.GL_TEXTURE_WRAP_T, GL3.GL_CLAMP_TO_EDGE);
        gl3.glTexParameteri(GL3.GL_TEXTURE_RECTANGLE, GL3.GL_TEXTURE_MIN_FILTER, GL3.GL_NEAREST);
        gl3.glTexParameteri(GL3.GL_TEXTURE_RECTANGLE, GL3.GL_TEXTURE_MAG_FILTER, GL3.GL_NEAREST);

        gl3.glTexImage2D(GL3.GL_TEXTURE_RECTANGLE, 0, GL3.GL_DEPTH_COMPONENT32F, width, height, 0, GL3.GL_DEPTH_COMPONENT, GL3.GL_FLOAT, null);
        /**
         * IDs.
         */
        gl3.glBindTexture(GL3.GL_TEXTURE_RECTANGLE, textures[id]);

        gl3.glTexParameteri(GL3.GL_TEXTURE_RECTANGLE, GL3.GL_TEXTURE_WRAP_S, GL3.GL_CLAMP_TO_EDGE);
        gl3.glTexParameteri(GL3.GL_TEXTURE_RECTANGLE, GL3.GL_TEXTURE_WRAP_T, GL3.GL_CLAMP_TO_EDGE);
        gl3.glTexParameteri(GL3.GL_TEXTURE_RECTANGLE, GL3.GL_TEXTURE_MIN_FILTER, GL3.GL_NEAREST);
        gl3.glTexParameteri(GL3.GL_TEXTURE_RECTANGLE, GL3.GL_TEXTURE_MAG_FILTER, GL3.GL_NEAREST);

        gl3.glTexImage2D(GL3.GL_TEXTURE_RECTANGLE, 0, GL3.GL_R16UI, width, height, 0, GL3.GL_RED, GL3.GL_UNSIGNED_SHORT, null);
        /**
         * FBO.
         */
        gl3.glBindFramebuffer(GL3.GL_FRAMEBUFFER, fbo[0]);
        gl3.glFramebufferTexture2D(GL3.GL_FRAMEBUFFER, GL3.GL_DEPTH_ATTACHMENT, GL3.GL_TEXTURE_RECTANGLE, textures[depth], 0);
        gl3.glFramebufferTexture2D(GL3.GL_FRAMEBUFFER, GL3.GL_COLOR_ATTACHMENT0, GL3.GL_TEXTURE_RECTANGLE, textures[id], 0);

id-glTexImage2D で次のエラーが発生します

GLDebugEvent[ id 0x502
    type Error
    severity High: dangerous undefined behavior
    source GL API
    msg GL_INVALID_OPERATION error generated. Texture type and format combination is not valid.
    when 1391769197680
    source 4.4 (Compat profile, arb, debug, ES2 compat, ES3 compat, FBO, hardware) - 4.4.0 - hash 0x1c19b340]
java.lang.Exception: Stack trace
at java.lang.Thread.dumpStack(Thread.java:1364)
at jogamp.opengl.GLDebugMessageHandler$StdErrGLDebugListener.messageSent(GLDebugMessageHandler.java:308)
at jogamp.opengl.GLDebugMessageHandler.sendMessage(GLDebugMessageHandler.java:293)
at jogamp.opengl.GLDebugMessageHandler.glDebugMessageARB(GLDebugMessageHandler.java:319)
at jogamp.opengl.gl4.GL4bcImpl.dispatch_glTexImage2D1(Native Method)
at jogamp.opengl.gl4.GL4bcImpl.glTexImage2D(GL4bcImpl.java:27313)
at javax.media.opengl.DebugGL4bc.glTexImage2D(DebugGL4bc.java:19874)
at ec.rendering.input.picking.EC_Picking.initRenderingTargets(EC_Picking.java:107)

完全を期すために、ここでVS:

#version 330

layout (location = 0) in vec3 position;

uniform mat4 modelToWorldMatrix;

layout(std140) uniform GlobalMatrices {
    mat4 worldToCameraMatrix;
    mat4 cameraToClipMatrix;
};

void main() {

    gl_Position = cameraToClipMatrix * (worldToCameraMatrix * vec4(position, 1.0));
}

modelToWorldMatrix は現時点ではまだ考慮されていません

そしてここでFS:

#version 330

uniform uint id;

out vec4 outputColor;

void main() {

    outputColor = vec4(id, 0, 0, 1);
}

ショーツの使用は可能ですか?

Jogl、OpenGL 3.3

編集:今はその部分を解決したようです

gl3.glTexImage2D(GL3.GL_TEXTURE_RECTANGLE, 0, GL3.GL_R16I, width, height, 0, GL3.GL_RED_INTEGER, GL3.GL_SHORT, null);

しかし、短いユニフォーム値を設定しようとするとエラーが発生するようになりました

gl3.glUniform1i(pickModel.getIdUL(), (int)mesh.getId());

エラー

GLDebugEvent[ id 0x502
    type Error
    severity High: dangerous undefined behavior
    source GL API
    msg GL_INVALID_OPERATION error generated. Wrong component type or count.
    when 1391779682993
    source 4.4 (Compat profile, arb, debug, ES2 compat, ES3 compat, FBO, hardware) - 4.4.0 - hash 0x5ee072e3]

-1(実際には1)ではないため、均一な場所は正しいようです...

では、どうすれば短編をアップロードできますか?

4

1 に答える 1

0

あなたの問題のほとんどは、OpenGL が期待するほど変換に寛大ではないという事実に関連しています。

まず第一にglUniform、一様変数の型とサイズが関数と完全に一致している必要があります。具体的には、ドキュメントには次のように記載されています。

GL_INVALID_OPERATIONこの関数の符号付き整数バリアントの 1 つを使用して、unsigned int、uvec2、uvec3、uvec4、またはこれらの配列の型の一様変数をロードする場合に生成されます。

したがってglUniform1ui変数idが. uint_


それ以外にも、フレームバッファーの出力形式とシェーダーの出力形式の間に不一致があります。整数テクスチャに書き込みたい場合は、シェーダーから実際の整数を書き込む必要があるためoutputColor

out int outputID;

または多分

out ivec4 outputID;

必要に応じて(またはもちろん使用する場合は「u」を使用してGL_R16UI)。


ところで、符号付き整数テクスチャが必要ですか (ユースケースでは符号なしの方がはるかに自然なので)? glTexImage2Dあなたは、呼び出しを変更すると言います

gl3.glTexImage2D(GL3.GL_TEXTURE_RECTANGLE, 0, GL3.GL_R16I, width, height, 0, GL3.GL_RED_INTEGER, GL3.GL_SHORT, null);

テクスチャ エラーが消えましたが、これは署名された形式の使用が原因であるとは限らず、GL_RED_INTEGER代わりに を使用したことが原因である可能性が非常に高いです。GL_REDしたがって、 and とGL_R16UI一緒にGL_UNSIGNED_SHORT(GL_RED_INTEGERもちろん、出力変数のuintorも) 試してみる価値があります。uvec4

タイプは常に一致する必要があることに注意してください。

于 2014-02-17T13:26:20.423 に答える