2016-12-12 8 views
0

私は私の人生の中ではエクササイズできませんimageStoreを計算シェーダ内で使用して深度テクスチャに書き込む方法については、いくつかの例(例えばthisthis)、私はまだ欠陥を見つけることができません。テクスチャにFramebufferとして書き込むことができますが、glTexImage2D()を呼び出すときに何らかの理由でこの計算シェーダを実行しても、テクスチャの名前は影響を受けません。imageStore計算シェーダの深度テクスチャ

上記が該当する場合は、以下の受け入れ可能な回答に直接スキップできます。


私は明確なフォーマットに関連するコードを抽出してきたの下に、それはエラーチェックの束を持つクラスに共通GL操作をラップはるかに大きいプロジェクトの一部です。しかし、自分でthe projectと書いたので、何が呼び出されているのか、また呼び出されていないのか分かります。

私は計算シェーダを持っていますが、これは非常に簡単で、すべてのピクセルに0.5fを書き込む必要があります(デバッグレンダリングではシアンとして出力されます)。

#version 430 
layout(local_size_x=16,local_size_y=16) in; 

uniform uvec2 _imageDimensions; 
uniform layout (r32f) writeonly image2D _imageOut; 

void main() 
{ 
    if(gl_GlobalInvocationID.x<_imageDimensions.x 
    &&gl_GlobalInvocationID.y<_imageDimensions.y) 
    { 
     imageStore(_imageOut, ivec2(gl_GlobalInvocationID.xy), vec4(0.5f)); 
    } 
} 

私は

glUseProgram(computeShader) 
//Dimensions 
GLint location = glGetUniformLocation(computeShader, "_imageDimensions"); 
glUniform2uiv(location, 1, glm::value_ptr(shadowDims)); 
//Image unit 
const int IMAGE_UNIT = 0; 
location = glGetUniformLocation(computeShader, "_imageOut"); 
glUniform1iv(location , 1, &IMAGE_UNIT); 
glUseProgram(0) 

を使用してシェーダーを設定し、最終的に私は私が試した

glUseProgram(computeShader) 
glBindImageTexture(IMAGE_UNIT, shadowOut, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_R32F); 
//Split the image into work groups of size 16x16 
glm::uvec2 launchConfig = shadowDims/ glm::uvec2(16) + glm::uvec2(1); 
glDispatchCompute(launchConfig.x, launchConfig.y, 1); 
//Synchronise written memory 
glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT); 

でシェーダを起動

glm::uvec2 shadowDims = glm::uvec2(4096); 
GLuint shadowOut; 
glGenTextures(1, &shadowOut); 
glBindTexture(GL_TEXTURE_2D, shadowOut); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32F, shadowDims.x, shadowDims.y, 0, GL_DEPTH_COMPONENT, GL_FLOAT, 0); 
glBindTexture(GL_TEXTURE_2D, 0); 

を使用してテクスチャを作成いくつかの微調整が、私は何をする、テクスチャはレンダリングされたままですが、まず初期化時にテクスチャを設定します。

GLエラーは発生しません(私はすべてのgl fnのものをラップする前処理マクロを持っています)。実際に実行されたコードは上記よりも抽象的ですが、varsを失うバグはありません。 /かわった。あなたができないためだコンピュートシェーダー内の私の人生のため

答えて

3

私はできません(深さ)に書き込むための方法をワークアウトimageStoreを使用してテクスチャ

Image Load/Storeは、color image formatsの読み取り/書き込みにのみ使用できます。深度やステンシルの形式では使用できません。

いいえ、glCopyImageSubDataを使用して色と奥行き画像をコピーすることはできません。計算シェーダは、深さ/ステンシルフォーマットを読み取ることができますが、image変数ではなく、sampler秒までしか読み取ることができません。

+0

おかげさまで、後見では 'GL_DEPTH_COMPONENT32F'はビューポートに基づいて自動的に正規化されますが(計算シェーダでは利用できません)、' r32f'で十分です。残念です。だから、コンピュータのシェーダでぼかしを行うために、深度/影のマップをカラーアタッチメントとして作成する必要があります。 – Robadob

関連する問題