私は私の人生の中ではエクササイズできませんimageStore
を計算シェーダ内で使用して深度テクスチャに書き込む方法については、いくつかの例(例えばthisとthis)、私はまだ欠陥を見つけることができません。テクスチャに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を失うバグはありません。 /かわった。あなたができないためだコンピュートシェーダー内の私の人生のため
おかげさまで、後見では 'GL_DEPTH_COMPONENT32F'はビューポートに基づいて自動的に正規化されますが(計算シェーダでは利用できません)、' r32f'で十分です。残念です。だから、コンピュータのシェーダでぼかしを行うために、深度/影のマップをカラーアタッチメントとして作成する必要があります。 – Robadob