【发布时间】:2015-05-02 14:39:08
【问题描述】:
我正在尝试了解顶点和片段着色器在 OpenGL ES 2.0 中的工作原理。
我的着色器如下所示:
顶点着色器:
// source code for the vertex shader
attribute vec4 vPosition
attribute vec2 a_texCoord;
varying vec2 v_texCoord;
void main() {
gl_Position = vPosition;
v_texCoord = a_texCoord;
}
片段着色器:
// source code for the fragment shader
precision mediump float;
uniform sampler2D s_texture;
varying vec2 v_texCoord;
void main() {
gl_FragColor = texture2D(s_texture, v_texCoord);
}
使用这些着色器的程序绘制一个带有纹理(图像)的简单二维矩形。首先,它将矩形的顶点和纹理坐标传递给带有属性的顶点着色器。然后顶点着色器将带有变量的纹理坐标传递给片段着色器。
让我困惑的是向量 vPosition、a_texCoord 和 v_texCoord 只能保存 1 个 Point,但需要保存 4 个不同的 Point。我在某处读到将为每个顶点调用顶点着色器。这是否意味着对于我要绘制的每个图像,顶点和片段着色器将被处理 4 次?当我定义属性(glVertexAttribPointer)时,我使用的是一个有 4 个点的数组,着色器如何将 4 个点保存在一个只能存储 1 个点的变量中?
我想使用制服而不是属性,我读得更好。我也不需要可变变量。我想要这样:
顶点着色器:
// source code for the vertex shader
uniform vec4 vPosition;
void main() {
gl_Position = vPosition;
}
片段着色器:
// source code for the fragment shader
precision mediump float;
uniform sampler2D s_texture;
uniform vec2 v_texCoord;
void main() {
gl_FragColor = texture2D(s_texture, v_texCoord);
}
这可能吗?我仍然可以将我需要的所有点传递给着色器吗?这是个好主意吗?
【问题讨论】:
标签: android opengl-es glsl opengl-es-2.0 glsles