6

投影されたテクスチャを 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 メソッドを設定することは適切な方法ではありませんが、視覚的な結果を得る唯一の方法であることは認識しています。何が起こるかは、フラグメントシェーダーをほとんど排除し、スクリーンスペースに描画することだと私には思えます...

これを適切に機能させるにはどうすればよいですか? (私の主な焦点は、テクスチャに何かを書き込んで更新できるようにすることです)

さらにコードを投稿する必要がある場合はお知らせください。

4

1 に答える 1

3

この場合、FBOの方が簡単で高速であると考えており、代わりに FBO をお勧めします。しかし、質問自体は依然として非常に有効です。

テクスチャ全体に青を書いていることを考えると、球体を見て驚いています (テクスチャ サイズが 16 の倍数でない場合はエッジ ビットを差し引いたものです)。これは他の場所のコードからのものだと思います。

とにかく、あなたの主な問題は、通常のレンダリングのセットアップ コードの外側にある計算シェーダーからテクスチャに書き込むことができるようです。これは、イメージのバインド方法に関連していると思われますdestTexTexUnitメソッドとメソッドが何をするのかわかりませんactivateが、GL テクスチャを画像ユニットにバインドするには、次のようにします。

int imageUnitIndex = 0; //something unique
int uniformLocation = glGetUniformLocation(...);
glUniform1i(uniformLocation, imageUnitIndex); //program must be active
glBindImageTexture(imageUnitIndex, textureHandle, ...);

見る:

最後に、あなたが使用してimage2DいるようGL_SHADER_IMAGE_ACCESS_BARRIER_BITに、使用する障壁もあります。GL_SHADER_STORAGE_BARRIER_BITストレージ バッファ オブジェクト用です。

于 2014-12-18T03:56:56.427 に答える