在iOS/iPhone上向片段着色器OpenGL ES 2.0发送布尔值

在iOS/iPhone上向片段着色器OpenGL ES 2.0发送布尔值,iphone,ios,opengl-es,opengl-es-2.0,fragment-shader,Iphone,Ios,Opengl Es,Opengl Es 2.0,Fragment Shader,我是OpenGL ES 2.0的新手,所以请容忍我。。。我想将BOOL标志传递到片段着色器中,以便在我的应用程序中发生某个触摸事件后,它以不同的方式渲染gl_FragColor。我尝试为此使用vec2属性,只是将.x值“假装”为我的“BOOL”,但看起来OpenGL正在将该值从0.0规范化为1.0,然后着色器才能获得该值。因此,即使在我的应用程序中,我已将其设置为0.0,但在着色器执行其操作时,该值最终将达到1.0。如有任何建议,我们将不胜感激 VertexAttrib代码: // set up

我是OpenGL ES 2.0的新手,所以请容忍我。。。我想将BOOL标志传递到片段着色器中,以便在我的应用程序中发生某个触摸事件后,它以不同的方式渲染gl_FragColor。我尝试为此使用vec2属性,只是将.x值“假装”为我的“BOOL”,但看起来OpenGL正在将该值从0.0规范化为1.0,然后着色器才能获得该值。因此,即使在我的应用程序中,我已将其设置为0.0,但在着色器执行其操作时,该值最终将达到1.0。如有任何建议,我们将不胜感激

VertexAttrib代码:

// set up context, shaders, use program etc.

[filterProgram addAttribute:@"inputBrushMode"];
inputBrushModeAttribute = [filterProgram attributeIndex:@"inputBrushMode"];

bMode[0] = 0.0;
bMode[1] = 0.0;

glVertexAttribPointer(inputBrushModeAttribute, 2, GL_FLOAT, 0, 0, bMode);
...
attribute vec2 inputBrushMode;
varying highp float brushMode;

void main()
{
    gl_Position = position;
    ...
    brushMode = inputBrushMode.x;
}
...
varying highp float brushMode;

void main()
{
    if(brushMode < 0.5) {
        // render the texture
        gl_FragColor = texture2D(inputImageTexture, textureCoordinate);
    } else {
        // cover things in yellow funk
        gl_FragColor = vec4(1,1,0,1);
    }
}
当前顶点着色器代码:

// set up context, shaders, use program etc.

[filterProgram addAttribute:@"inputBrushMode"];
inputBrushModeAttribute = [filterProgram attributeIndex:@"inputBrushMode"];

bMode[0] = 0.0;
bMode[1] = 0.0;

glVertexAttribPointer(inputBrushModeAttribute, 2, GL_FLOAT, 0, 0, bMode);
...
attribute vec2 inputBrushMode;
varying highp float brushMode;

void main()
{
    gl_Position = position;
    ...
    brushMode = inputBrushMode.x;
}
...
varying highp float brushMode;

void main()
{
    if(brushMode < 0.5) {
        // render the texture
        gl_FragColor = texture2D(inputImageTexture, textureCoordinate);
    } else {
        // cover things in yellow funk
        gl_FragColor = vec4(1,1,0,1);
    }
}
当前片段着色器代码:

// set up context, shaders, use program etc.

[filterProgram addAttribute:@"inputBrushMode"];
inputBrushModeAttribute = [filterProgram attributeIndex:@"inputBrushMode"];

bMode[0] = 0.0;
bMode[1] = 0.0;

glVertexAttribPointer(inputBrushModeAttribute, 2, GL_FLOAT, 0, 0, bMode);
...
attribute vec2 inputBrushMode;
varying highp float brushMode;

void main()
{
    gl_Position = position;
    ...
    brushMode = inputBrushMode.x;
}
...
varying highp float brushMode;

void main()
{
    if(brushMode < 0.5) {
        // render the texture
        gl_FragColor = texture2D(inputImageTexture, textureCoordinate);
    } else {
        // cover things in yellow funk
        gl_FragColor = vec4(1,1,0,1);
    }
}
。。。
可变高功率浮刷模式;
void main()
{
如果(刷模式<0.5){
//渲染纹理
gl_FragColor=纹理2D(输入图像纹理,纹理坐标);
}否则{
//用黄色的恐惧来掩盖事情
gl_FragColor=vec4(1,1,0,1);
}
}

提前感谢。

将bool创建为
glUniform
(1.0或0.0)。使用
glUniform1f(闪烁位置,GLfloat v0)
设置其值。在着色器中,检查其值,如下所示:

if (my_uniform < 0.5) {
    // FALSE
} else {
    // TRUE
}
if(我的制服<0.5){
//假的
}否则{
//真的
}

“看起来OpenGL在着色器获得该值之前正在将该值从0.0规格化为1.0。”首先,为什么不使用统一的标准?为什么要使用顶点属性?第二,提供此属性的设置代码在哪里?您是否正确使用了
glvertexattributepointer
?我的印象是制服的值以后不能更改,不是吗?我很确定我正确地使用了
glvertexattributepointer
——我将添加该代码。谢谢。您可以在任何时候更改统一值(除了在批处理的中间)。@ Tabe:制服在绘图调用中不会改变。但是它们可以在使用
glUniform
的draw调用之间更改。与“属性”和“变化”相比,它们是“一致的”。永远无法改变的是
const
。啊,很好,谢谢,我得试一试。是否可以将单个浮点作为统一值传递,或者它还需要是vec2数组指针?因为浮点精度。如果手动将其设置为0.0或1.0,则不应遇到精度问题。如果您在传递浮点之前对其进行数学运算,则可能会出现舍入错误。@taber nice one,数月来一直在寻找解决方案。