[英]webGL2 fragment shader receives bad values
我正在尝试渲染3D纹理,但是片段着色器存在问题。 我应该收到0到1之间映射的纹理值,但是我只收到0和其他东西。 换句话说,我的意思是下一个代码(片段着色器)仅以我的形状打印红色和灰色:
编辑
#version 300 es
precision highp float;
precision highp int;
precision highp sampler3D;
uniform sampler3D in_texture;
in vec3 v_texcoord;
out vec4 color;
void main()
{
vec4 textureColor = texture(in_texture, v_texcoord);
//color = vec4(textureColor.r, 0.0, 0.0, 0.5);
if(textureColor.r == 0.0){
color = vec4(1.0,0.0,0.0,1.0);
}
if(textureColor.r != 0.0){
color = vec4(0.5,0.5,0.5,1.0);
}
if( textureColor.r > 0.0){
color = vec4(0.0,1.0,0.0,1.0);
}
if(textureColor.r < 0.0){
color = vec4(0.0,0.0,1.0,1.0);
}
}
我在创建纹理之前检查纹理的值(应该有更多颜色,因为数字从-32k到32k),并且使用以下参数创建纹理:
var textureData = new Int16Array();
//fill textureData
var texture = gl.createTexture();
gl.activeTexture(gl.TEXTURE0);
gl.bindTexture(gl.TEXTURE_3D, texture);
gl.texParameteri(gl.TEXTURE_3D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_3D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_3D, gl.TEXTURE_WRAP_R, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_3D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
gl.texParameteri(gl.TEXTURE_3D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
gl.texImage3D(
gl.TEXTURE_3D, // target
0, // level
gl.R16I, // internalformat
texW, // width
texH, // height
texD, // depth
0, // border
gl.RED_INTEGER, // format
gl.SHORT, // type
textureData // pixeldata
);
任何建议将不胜感激!
编辑
正如您在图片中看到的那样,我没有收到任何错误。
你的例子没有道理。 绘制时可能会收到错误INVALID_OPERATION
,甚至可能没有注意到
着色器中的这一行
uniform sampler3D in_texture;
不兼容与R16I
质感。
从WebGL2规范
5.23采样器类型必须与内部纹理格式匹配
纹理查找函数根据传递给查找函数的采样器类型,将值返回为浮点数,无符号整数或有符号整数。 如果错误的采样器类型用于纹理访问,即采样器类型与纹理内部格式不匹配,则返回值在OpenGL ES阴影语言3.00.6(OpenGL ES阴影语言3.00.6§8.8)中未定义。 在WebGL中,在相应的绘图调用(包括drawArrays,drawElements,drawArraysInstanced,drawElementsInstanced和drawRangeElements)中生成INVALID_OPERATION错误。
如果要使用R16I
纹理,则必须将上面的那行更改为使用isampler3D
// uniform sampler3D in_texture; BAD!!!
uniform isampler3D in_texture; GOOD!!
之后,此行将失败
vec4 textureColor = texture(in_texture, v_texcoord);
因为in_texture
现在仅返回整数或本例中的ivec4
。
目前尚不清楚您要发生什么。 如果要像归一化的值一样,要使整数值从-32768到+32787( R16I
是),则必须决定如何进行转换。 一个简单的转换就是
const int INT16_MIN = -32768;
const int INT16_MAX = 32767;
const int INT16_RANGE = INT16_MAX - INT16_MIN;
ivec4 intValues = texture(in_texture, v_texcoord);
vec4 textureColors = (float(intValues - INT16_MIN) / float(INT16_RANGE)) * 2. - 1.;
如果您想让0整数等于0 float,那就更复杂了
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.