【问题标题】:Send a BOOL value to a Fragment Shader OpenGL ES 2.0 on iOS / iPhone在 iOS / iPhone 上向 Fragment Shader OpenGL ES 2.0 发送 BOOL 值
【发布时间】:2012-07-07 23:59:25
【问题描述】:

我是 OpenGL ES 2.0 的新手,所以请多多包涵……我想将一个 BOOL 标志传递到我的片段着色器中,以便在我的应用程序中发生某个触摸事件后,它会以不同的方式呈现 gl_FragColor。我尝试为此使用 vec2 属性,只是将 .x 值“伪造”为我的“BOOL”,但看起来 OpenGL 在着色器获取它之前将值从 0.0 标准化为 1.0。因此,即使在我的应用程序中我已将其设置为 0.0,而着色器正在执行其操作,该值最终将达到 1.0。任何建议将不胜感激。

顶点属性代码:

// 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);
    }
}

提前致谢。

【问题讨论】:

  • “看起来 OpenGL 正在将值从 0.0 规范化到 1.0,然后着色器得到它” 首先,你为什么不使用制服?为什么要使用顶点属性?其次,您提供此属性的设置代码在哪里?你正确使用glVertexAttribPointer吗?
  • 我的印象是制服的价值以后不能改变,不是吗?我很确定我正确使用了glVertexAttribPointer - 我将添加该代码。谢谢。
  • 您可以随时更改统一值(批次中间除外)。
  • @taber:制服不会在 一次绘图调用中改变。但它们可以在使用glUniform 的绘图调用之间进行更改。与“属性”和“变化”相比,它们是“统一的”。永远无法改变的是const
  • 啊,太好了,谢谢,我得试一试制服。是否可以将单个浮点数作为统一传递,或者它也需要是 vec2 数组指针?

标签: iphone ios opengl-es opengl-es-2.0 fragment-shader


【解决方案1】:

改为将布尔值创建为 glUniform(1.0 或 0.0)。用glUniform1f(GLint location, GLfloat v0) 设置它的值。在着色器中,像这样检查它的值:

if (my_uniform < 0.5) {
    // FALSE
} else {
    // TRUE
}

【讨论】:

  • 因为浮点精度。
  • 如果您手动将其设置为 0.0 或 1.0,您应该不会遇到精度问题。如果您在传入浮点数之前对其进行数学运算,那么您将面临舍入错误的风险。
  • @taber 不错,几个月来一直在寻找解决方案。
猜你喜欢
  • 1970-01-01
  • 2015-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 2012-07-22
  • 1970-01-01
相关资源
最近更新 更多