OpenGL ES 2.0 彩色矩形
OpenGL ES 2.0 colored rectangle
我想使用 OpenGL ES 2.0 为 Android 编写一个显示彩色矩形的应用程序,如下所示:
这是我的 2 个着色器:
// Vertex Shader
attribute vec4 vPosition;
void main() {
gl_Position = vPosition;
}
// Fragment Shader
uniform vec4 u_colorRGBA;
void main() {
gl_FragColor = u_colorRGBA;
}
我可以绘制不同颜色的矩形,但我想绘制它们以便每个角都有不同的颜色。我可以将变量从顶点着色器传递到片段着色器来定义每个角的颜色吗?如果是这样,我如何定义变量并将它们传递过来?或者有其他方法吗?
我想出了一个办法:
我这样更改了我的着色器:
// Vertex Shader
attribute vec4 inColor;
varying vec4 vColor;
attribute vec4 vPosition;
void main() {
gl_Position = vPosition;
vColor = inColor;
}
// Fragment Shader
varying vec4 vColor;
void main() {
gl_FragColor = vColor;
}
然后我这样画矩形:
public static void Draw(float vertices[], int verticesCount, float color[]) {
vertexBuffer.put(vertices);
vertexBuffer.position(0);
GLES20.glEnableVertexAttribArray(sPosition);
GLES20.glVertexAttribPointer(sPosition, 3, GLES20.GL_FLOAT, false, 0, vertexBuffer);
colorBuffer.put(color);
colorBuffer.position(0);
GLES20.glEnableVertexAttribArray(sColor);
GLES20.glVertexAttribPointer(sColor, 4, GLES20.GL_FLOAT, false, 0, colorBuffer);
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, verticesCount); // Draw
GLES20.glDisableVertexAttribArray(sPosition);
GLES20.glDisableVertexAttribArray(sColor);
}
这是正确的做法吗?还是他们有更好的方法?
干得好,这只是通过两个着色器传递颜色变量的一种方法。
但是,更简单一点,您可以不通过两个着色器来完成。
vec2 uv = gl_FragCoord.xy / resolution.xy;
gl_FragColor = vec4(uv,0.0,1.0);
你仍然需要传递一个 uniform2f,resolution 直接进入片段着色器,或者你可以将它定义为常量,如 const vec2 resolution = vec2( 320.,480.); 在片段着色器中
我想使用 OpenGL ES 2.0 为 Android 编写一个显示彩色矩形的应用程序,如下所示:
这是我的 2 个着色器:
// Vertex Shader
attribute vec4 vPosition;
void main() {
gl_Position = vPosition;
}
// Fragment Shader
uniform vec4 u_colorRGBA;
void main() {
gl_FragColor = u_colorRGBA;
}
我可以绘制不同颜色的矩形,但我想绘制它们以便每个角都有不同的颜色。我可以将变量从顶点着色器传递到片段着色器来定义每个角的颜色吗?如果是这样,我如何定义变量并将它们传递过来?或者有其他方法吗?
我想出了一个办法:
我这样更改了我的着色器:
// Vertex Shader
attribute vec4 inColor;
varying vec4 vColor;
attribute vec4 vPosition;
void main() {
gl_Position = vPosition;
vColor = inColor;
}
// Fragment Shader
varying vec4 vColor;
void main() {
gl_FragColor = vColor;
}
然后我这样画矩形:
public static void Draw(float vertices[], int verticesCount, float color[]) {
vertexBuffer.put(vertices);
vertexBuffer.position(0);
GLES20.glEnableVertexAttribArray(sPosition);
GLES20.glVertexAttribPointer(sPosition, 3, GLES20.GL_FLOAT, false, 0, vertexBuffer);
colorBuffer.put(color);
colorBuffer.position(0);
GLES20.glEnableVertexAttribArray(sColor);
GLES20.glVertexAttribPointer(sColor, 4, GLES20.GL_FLOAT, false, 0, colorBuffer);
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, verticesCount); // Draw
GLES20.glDisableVertexAttribArray(sPosition);
GLES20.glDisableVertexAttribArray(sColor);
}
这是正确的做法吗?还是他们有更好的方法?
干得好,这只是通过两个着色器传递颜色变量的一种方法。
但是,更简单一点,您可以不通过两个着色器来完成。
vec2 uv = gl_FragCoord.xy / resolution.xy;
gl_FragColor = vec4(uv,0.0,1.0);
你仍然需要传递一个 uniform2f,resolution 直接进入片段着色器,或者你可以将它定义为常量,如 const vec2 resolution = vec2( 320.,480.); 在片段着色器中