私はまだここに明確な答えがあるとは思わない。だからここに私はそれが2Dテクスチャを介して動作作った方法です:GLSL側で
// First, create a frame buffer:
glGenFramebuffers(1, &fbo);
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
// Then generate your texture and define an unsigned int array:
glGenTextures(1, &textureid);
glBindTexture(GL_TEXTURE_2D, textureid);
glTexImage2D(GL_TEXTURE_2D, 0, GL_R32UI, w, h, 0, GL_RED_INTEGER, GL_UNSIGNED_INT, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
// Attach it to the frame buffer object:
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, textureid, 0);
// Before rendering
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
GLuint buffers[2] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 }; // this assumes that there is another texture that is for the render buffer. Color attachment1 is preserved for the element ids.
glDrawBuffers(2, buffers);
// Clear and render here
glFlush(); // Flush after just in case
glBindFramebuffer(GL_FRAMEBUFFER, 0);
フラグメントシェーダ(ここでは4.3コアプロファイルコード)を持っている必要があります。
layout(location = 0) out vec4 colorOut; // The first element in 'buffers' so location 0
layout(location = 1) out uvec4 elementID; // The second element in 'buffers' so location 1. unsigned int vector as color
// ...
void main()
{
//...
elementID = uvec4(elementid, 0, 0, 0); // Write the element id as integer to the red channel.
}
あなたが値を読みことができますホスト側:
unsigned int* ids = new unsigned int[ w*h ];
glBindTexture(GL_TEXTURE_2D, textureid);
glGetTexImage(GL_TEXTURE_2D, 0, GL_RED_INTEGER, GL_UNSIGNED_INT, ids);
私はGL_LUMINANCE16ですでに作業していますが、私はいくつかの理由でそれをレンダリングすることができます - 多分それをサポートするグラフィックスカードですか?整数テクスチャ形式を使用する場合、1つのレンダーターゲットに対してint出力を定義するにはどうすればよいですか?シェーダで5つのカラーアタッチメントを使用し、最初の4つはint浮動小数点テクスチャをレンダリングし、5番目はobjectIdをレンダリングします。それは今(GL_LUMINANCE16を使用して)動作しますが、多分私は未定義の振る舞いを使用していますか?私はOpenGL 4.2のコンテキストを持っています – Mat
@Mat: 'int'出力に書き込むために出力を' int'に宣言する必要があります。また、これが動作することを考慮すると、私はあなたがNVIDIAカードを持っていると推測しています。 –
はい、私はnvidiaカードを持っています。しかし、どのように私はintとして単一の出力コンポーネントを宣言できますか?私はあなたのアウトプットを持っています。あなたのアウトプットはvec4 out_colors [5] ' – Mat