gpt4 book ai didi

android - GLSL 错误 : No vertex attrib is enabled in a draw call

转载 作者:行者123 更新时间:2023-11-29 15:53:34 26 4
gpt4 key购买 nike

我正在 OpenGL ES 2.0 中为 android 编写应用程序,但我遇到了一些着色器代码的问题。在这里:

attribute vec4 vPosition;
vec4 tempPosition;

void main() {
tempPosition = vPosition;
tempPosition.x = 2 - tempPosition.x;
gl_Position = tempPosition.yxzw;
}

导致错误的行是这一行:

tempPosition.x = 2 - tempPosition.x;

每次我想画东西时,我都会启用和禁用顶点属性数组。在我画之前我称之为:GLES20.glEnableVertexAttribArray(sPosition); 在我画之后我称之为GLES20.glDisableVertexAttribArray(sPosition);

我做错了什么?如何从 2 中减去 x?

编辑:

如果我将导致错误的行更改为:

tempPosition.xz = vec2(2,0) - tempPosition.xz;

它确实有效,但为什么我不能用一个数字减去?

最佳答案

在与 ES 2.0 一起使用的 GLSL 版本中(有点神秘的是版本 1.00),没有隐式类型转换。您不能将 int 类型的值添加到 float 类型的值或浮点向量。

这在规范的第 4 章“变量和类型”的介绍中指定:

The OpenGL ES Shading Language is type safe. There are no implicit conversions between types.

在第 5.9 节“表达式”中更详细地介绍了这种情况,其中定义了 + 运算符:

The two operands must be the same type, or one can be a scalar float and the other a float vector or matrix, or one can be a scalar integer and the other an integer vector.

因此,在操作 float 时需要使用 float 常量:

tempPosition.x = 2.0 - tempPosition.x;

更有趣的情况是为什么你的第二次尝试成功了,因为你也在混合不同的类型:

tempPosition.xz = vec2(2,0) - tempPosition.xz;

这是合法的,因为构造函数可以用于转换类型,并且是这样做的主要机制。例如,您可以将原始表达式写为:

tempPosition.x = float(2) - tempPosition.x;

这对于常量值看起来很尴尬,但如果整数值在变量中会更有意义:

int foo = ...;
tempPosition.x = float(foo) - tempPosition.x;

回到向量案例,第 5.4.2 节“向量和矩阵构造函数”指定:

If the basic type (bool, int, or float) of a parameter to a constructor does not match the basic type of the object being constructed, the scalar construction rules (above) are used to convert the parameters.

这意味着您可以使用 int 值作为 vec2 构造函数的参数,即使它包含 float 值。在这种情况下,值会自动转换。换句话说,你的第二个陈述等同于:

tempPosition.xz = vec2(float(2), float(0)) - tempPosition.xz;

恕我直言,不依赖隐式转换仍然更清晰,并写:

tempPosition.xz = vec2(2.0, 0.0) - tempPosition.xz;

请注意,完整的 OpenGL 在这方面不同于 OpenGL ES。在完整的 GLSL 中,存在隐式类型转换。我个人觉得这很不幸,因为我相信类型安全是一个有用的原则。

关于android - GLSL 错误 : No vertex attrib is enabled in a draw call,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29179916/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com