投影されたテクスチャを 3D オブジェクトのより大きなテクスチャにコピーする CPU コードを実装しましたが、必要に応じて「デカール ベイク」を行いましたが、GPU に実装する必要があります。これを行うには、現在のセットアップで FBO を追加するのが非常に難しいため、コンピューティング シェーダーを使用したいと考えています。
この質問は、コンピュート シェーダーの使用方法に関するものですが、興味のある人にとっては、アイデアはユーザー jozxyqk から得た回答に基づいています。
書き込み先のテクスチャは と呼ばれる私のコードにあります_texture
が、投影されたものは_textureProj
シンプルな計算シェーダー
const char *csSrc[] = {
"#version 440\n",
"layout (binding = 0, rgba32f) uniform image2D destTex;\
layout (local_size_x = 16, local_size_y = 16) in;\
void main() {\
ivec2 storePos = ivec2(gl_GlobalInvocationID.xy);\
imageStore(destTex, storePos, vec4(0.0,0.0,1.0,1.0));\
}"
};
ご覧のとおり、現在、テクスチャを任意の (青) 色に更新したいだけです。
更新機能
void updateTex(){
glUseProgram(_computeShader);
const GLint location = glGetUniformLocation(_computeShader, "destTex");
if (location == -1){
printf("Could not locate uniform location for texture in CS");
}
// bind texture
glUniform1i(location, 0);
glBindImageTexture(0, *_texture, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_RGBA32F);
// ^second param returns the GLint id - that im sure of.
glDispatchCompute(_texture->width() / 16, _texture->height() / 16, 1);
glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT);
glUseProgram(0);
printOpenGLError(); // reports no errors.
}
問題updateTex()
メインプログラムオブジェクトの外側を
呼び出すと、効果はありませんが、スコープ内で呼び出すと、次のようになります。
glUseProgram(_id); // vert, frag shader pipe
updateTex();
// Pass uniforms to shader
// bind _textureProj & _texture (latter is the one im trying to update)
glUseProgram(0);
次に、レンダリングすると、次のように表示されます。
質問: メイン プログラム オブジェクト スコープ内で update メソッドを設定することは適切な方法ではありませんが、視覚的な結果を得る唯一の方法であることは認識しています。何が起こるかは、フラグメントシェーダーをほとんど排除し、スクリーンスペースに描画することだと私には思えます...
これを適切に機能させるにはどうすればよいですか? (私の主な焦点は、テクスチャに何かを書き込んで更新できるようにすることです)
さらにコードを投稿する必要がある場合はお知らせください。