首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android OpenGL-ES-2.0圆或光盘

Android OpenGL-ES-2.0圆或光盘
EN

Stack Overflow用户
提问于 2016-02-16 09:11:48
回答 1查看 318关注 0票数 0

我试着用OpenGL-ES 2.0绘制一个光盘。基于user2901066对这个问题的第二个回答,我正在做以下工作:

代码语言:javascript
复制
String VertexShaderCode ="uniform mat4 uMVPMatrix;\n" +
        "attribute vec4 vPosition;\n" +
        "void main() {\n" +
        "gl_Position = uMVPMatrix * vPosition;\n" +
        "}";
String FragmentShaderCode = "precision mediump float;\n" +
        "void main() {\n" +

        //The problem is here

        //"if ((textureCoord.x * textureCoord.x) + (textureCoord.y * textureCoord.y) <= 1.0)" +
        "if (true)\n" +

        "gl_FragColor = vec4(1.0f, 0.0f, 0.0f, 1.0f);\n" +
        "else\n" +
        "gl_FragColor = vec4(1.0f, 0.0f, 0.0f, 0.0f);\n" +
        "}";
int vertexShader = this.loadShader(GLES20.GL_VERTEX_SHADER, VertexShaderCode);
int fragmentShader = this.loadShader(GLES20.GL_FRAGMENT_SHADER, FragmentShaderCode);

mGlProgram = GLES20.glCreateProgram();
GLES20.glAttachShader(mGlProgram, vertexShader);
GLES20.glAttachShader(mGlProgram, fragmentShader);
GLES20.glLinkProgram(mGlProgram);

GLES20.glEnable(GLES20.GL_BLEND);
GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA);

protected int PositionHandle;
protected int MVPMatrixHandle;
static final int COORDS_PER_VERTEX = 3;
private final int VertexStride = COORDS_PER_VERTEX * 4;

private float LineCoords[] = new float[4 * 3];
private FloatBuffer VertexBuffer;
private final int VertexCount = 4;

ByteBuffer bb = ByteBuffer.allocateDirect(LineCoords.length * 4);
bb.order(ByteOrder.nativeOrder());

VertexBuffer = bb.asFloatBuffer();
VertexBuffer.put(LineCoords);
VertexBuffer.position(0);

float[] mvpMatrix = {1.0f, 0.0f, 0.0f, 0.0f,
        0.0f, 1.0f, 0.0f, 0.0f,
        0.0f, 0.0f, 1.0f, 0.0f,
        0.0f, 0.0f, 0.0f, 1.0f};

LineCoords[0] = -1.0f;
LineCoords[1] = 1.0f;
LineCoords[3] = -1.0f;
LineCoords[4] = -1.0f;
LineCoords[6] = 1.0f;
LineCoords[7] = -1.0f;
LineCoords[9] = 1.0f;
LineCoords[10] = 1.0f;

VertexBuffer.put(LineCoords);
VertexBuffer.position(0);

GLES20.glUseProgram(mGlProgram);
PositionHandle = GLES20.glGetAttribLocation(mGlProgram, "vPosition");
GLES20.glEnableVertexAttribArray(PositionHandle);
GLES20.glVertexAttribPointer(PositionHandle, COORDS_PER_VERTEX, GLES20.GL_FLOAT, false, VertexStride, VertexBuffer);
MVPMatrixHandle = GLES20.glGetUniformLocation(mGlProgram, "uMVPMatrix");
GLES20.glUniformMatrix4fv(MVPMatrixHandle, 1, false, mvpMatrix, 0);
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_FAN, 0, VertexCount);
GLES20.glDisableVertexAttribArray(PositionHandle);

我的问题是如何获得片段着色器中的位置,以便应用正确的颜色。我该怎么做?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-17 02:26:00

您需要在两个着色器上声明一个可变变量:

代码语言:javascript
复制
varying vec2 textureCoord;

然后在顶点着色器上,给它赋值,例如:

代码语言:javascript
复制
textureCoord = gl_Position.xy;

然后将此变量发送到为每个片段插值的片段着色器,以便您的片段着色器可以使用它:

代码语言:javascript
复制
if ((textureCoord.x * textureCoord.x) + (textureCoord.y * textureCoord.y) <= 1.0)
{
    gl_FragColor = vec4(1.0f, 0.0f, 0.0f, 1.0f);
} else {
    gl_FragColor = vec4(1.0f, 0.0f, 0.0f, 0.0f);
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35428210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档