可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I am trying to write a simple vertex shader for an OpenGL ES app on the iPhone, but my array constructor is causing me trouble.
attribute vec4 normal; attribute vec4 position; void main(void){ const vec4 vertices[3] = vec4[](vec4(0.25, -0.25, 0.5, 1.0), vec4(-0.25, -0.25, 0.5, 1.0), vec4(0.25, 0.25, 0.5, 1.0)); gl_Position = vertices[gl_VertexID]; }
When using this code the shader is unable to compile, and gives me the eror message:
ERROR: 0:13: '(' : syntax error: Array size must appear after variable name
回答1:
The GLSL version used with ES 2.0 does not support constant arrays. From section "4.3.2 Constant Qualifier" on page 30 of the spec:
Arrays and structures containing arrays may not be declared constant since they cannot be initialized.
This restriction is lifted in ES 3.0, where it says in the corresponding section:
The const qualifier can be used with any of the non-void transparent basic data types as well as structures and arrays of these.
As an alternative, you should be able to use a non-constant array, where you assign the values one by one (untested):
vec4 vertices[3]; vertices[0] = vec4(0.25, -0.25, 0.5, 1.0); vertices[1] = vec4(-0.25, -0.25, 0.5, 1.0); vertices[2] = vec4(0.25, 0.25, 0.5, 1.0);
Or you could use a series of if-statements.
回答2:
Have you tried braces?
const vec4 vertices[3] = {vec4(0.25, -0.25, 0.5, 1.0), vec4(-0.25, -0.25, 0.5, 1.0), vec4(0.25, 0.25, 0.5, 1.0)};