繁体   English   中英

webGL2片段着色器收到错误的值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM