unsigned int テクスチャから正規化された float に変換し、再び元に戻す正しい方法は何ですか?
テストとして、現在 unsigned int テクスチャを標準の RGB コンテキストにレンダリングしようとしていますが、次のように動作していますが、うまくいきません。
関連するドローコード:
ShaderPropertySetter.SetUniform(gl, "uTexture_us2", 0);
ShaderPropertySetter.SetUniform(gl, "maxIntensity_u", MaxIntensity);
ShaderPropertySetter.SetUniform(gl, "minIntensity_u", MinIntensity);
ShaderPropertySetter.SetUniformMat4(gl, "uModelMatrix_m4", modelMatrix);
canvas.Bind(gl);// this binds the vertex buffer
gl.BindTexture(OpenGL.GL_TEXTURE_2D, texture);
gl.DrawArrays(OpenGL.GL_QUADS, 0, 4);
テクスチャの作成
public static void FillTextureDataWithUintBuffer(OpenGL gl, uint[] buffer, int width, int height)
{
unsafe
{
fixed (uint* dataprt = buffer)
{
IntPtr pixels = new IntPtr(dataprt);
const int GL_R32UI = 0x8236; //GL_R32UI is not currently defined in SharpGL
gl.TexImage2D(OpenGL.GL_TEXTURE_2D,
0,
GL_R32UI,
width,
height,
0,
OpenGL.GL_RED_INTEGER,
OpenGL.GL_UNSIGNED_INT,
pixels);
}
}
OpenGLTesting.CheckForFailure(gl);
}
現在のGLSLコード
---UPDATED---- (コメント投稿者が親切に指摘した愚かなエラーを修正) #version 150 コア
in vec2 pass_texCord;
uniform usampler2D uTexture_us2;
uniform uint maxIntensity_u;
uniform uint minIntensity_u;
float linearNormalize(float value, in float max, in float min)
{
//normalized = (x-min(x))/(max(x)-min(x))
return (value - min) / (max - min);
}
void main(void)
{
uvec4 value = texture(uTexture_us2, pass_texCord);
float valuef = float(value.r);
float max = float(maxIntensity_u);
float min = float(minIntensity_u);
float normalized = linearNormalize(valuef,max,min) ;
gl_FragColor = vec4(normalized,normalized,normalized,1);
}
したがって、ポイントを無効にしているように見えるフロートキャストを実行しているため、GLSLコードの現在の状態にはあまり満足していません(特に機能しないため:p)。
理由:
私は、テクスチャの一部が単一チャネルの unsigned int として保存され、他のテクスチャがトリプル チャネル float として保存されるコンポジターに取り組んでいます。
注: SharpGLを使用しています