我的render哪里写错了吗?为什么三角形显示不出来

郁闷的中交兵 2017-06-28 12:03:23
/*
*
* Triangle.java
*
* Created by Wuwang on 2016/9/30
*/
package edu.wuwang.opengl.render;

import android.opengl.GLES20;
import android.view.View;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

/**
* Description:
*/
public class Triangle extends Shape {

private FloatBuffer vertexBuffer;
private final String vertexShaderCode =
"attribute vec4 vPosition;" +
"void main() {" +
" gl_Position = vPosition;" +
"}";

private final String fragmentShaderCode =
"precision mediump float;" +
"uniform vec4 vColor;" +
"void main() {" +
" gl_FragColor = vColor;" +
"}";

private int mProgram;

static final int COORDS_PER_VERTEX = 3;
static float triangleCoords[] = {
1f, 0f, 0f,
0f, 1f, 0f,
-1f, 0f, 0f
};

private int mPositionHandle;
private int mColorHandle;

private float[] mViewMatrix=new float[16];

//顶点个数
private final int vertexCount = triangleCoords.length / COORDS_PER_VERTEX;
//顶点之间的偏移量
private final int vertexStride = COORDS_PER_VERTEX * 4; // 每个顶点四个字节

private int mMatrixHandler;

//设置颜色,依次为红绿蓝和透明通道
float color[] = { 1.0f, 1.0f, 1.0f, 1.0f };

public Triangle(View mView) {
super(mView);
ByteBuffer bb = ByteBuffer.allocateDirect(
triangleCoords.length * 4);
bb.order(ByteOrder.nativeOrder());

vertexBuffer = bb.asFloatBuffer();
vertexBuffer.put(triangleCoords);
vertexBuffer.position(0);
int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER,
vertexShaderCode);
int fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentShaderCode);

//创建一个空的OpenGLES程序
mProgram = GLES20.glCreateProgram();
//将顶点着色器加入到程序
GLES20.glAttachShader(mProgram, vertexShader);
//将片元着色器加入到程序中
GLES20.glAttachShader(mProgram, fragmentShader);
//连接到着色器程序
GLES20.glLinkProgram(mProgram);
}

@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {

}

@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {

}

@Override
public void onDrawFrame(GL10 gl) {

//将程序加入到OpenGLES2.0环境
GLES20.glUseProgram(mProgram);

//获取顶点着色器的vPosition成员句柄
mPositionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition");
//启用三角形顶点的句柄
GLES20.glEnableVertexAttribArray(mPositionHandle);
//准备三角形的坐标数据
GLES20.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX,
GLES20.GL_FLOAT, false,
vertexStride, vertexBuffer);
//获取片元着色器的vColor成员的句柄
mColorHandle = GLES20.glGetUniformLocation(mProgram, "vColor");
//设置绘制三角形的颜色
GLES20.glUniform4fv(mColorHandle, 1, color, 0);
//绘制三角形
GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount);
//禁止顶点数组的句柄
GLES20.glDisableVertexAttribArray(mPositionHandle);
}

}
...全文
130 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
likesyour 2017-06-29
  • 打赏
  • 举报
回复
public class ShaderHelper { private static final String TAG = "ShaderHelper"; /** * 加载并编译顶点着色器,返回得到的opengl id * @param shaderCode * @return */ public static int compileVertexShader(String shaderCode) { return compileShader(GL_VERTEX_SHADER, shaderCode); } /** * 加载并编译片段着色器,返回opengl id * @param shaderCode * @return */ public static int compileFragmentShader(String shaderCode) { return compileShader(GL_FRAGMENT_SHADER, shaderCode); } /** * 加载并编译着色器,返回opengl id * @param type * @param shaderCode * @return */ private static int compileShader(int type, String shaderCode) { // 建立新的着色器对象 final int shaderObjectId = glCreateShader(type); if (shaderObjectId == 0) { if (LoggerConfig.ON) { Log.w(TAG, "不能创建新的着色器."); } return 0; } // 传递着色器资源代码. glShaderSource(shaderObjectId, shaderCode); //编译着色器 glCompileShader(shaderObjectId); // 获取编译的状态 final int[] compileStatus = new int[1]; glGetShaderiv(shaderObjectId, GL_COMPILE_STATUS, compileStatus, 0); if (LoggerConfig.ON) { //打印log Log.v(TAG, "代码编译结果:" + "\n" + shaderCode + "\n:" + glGetShaderInfoLog(shaderObjectId)); } // 确认编译的状态 if (compileStatus[0] == 0) { // 如果编译失败,则删除该对象 glDeleteShader(shaderObjectId); if (LoggerConfig.ON) { Log.w(TAG, "编译失败!."); } return 0; } // 返回着色器的opengl id return shaderObjectId; } /** * 链接顶点着色器和片段着色器成一个program * 并返回这个pragram的opengl id * @param vertexShaderId * @param fragmentShaderId * @return */ public static int linkProgram(int vertexShaderId, int fragmentShaderId) { // 新建一个program对象 final int programObjectId = glCreateProgram(); if (programObjectId == 0) { if (LoggerConfig.ON) { Log.w(TAG, "不能新建一个 program"); } return 0; } // Attach the vertex shader to the program. glAttachShader(programObjectId, vertexShaderId); // Attach the fragment shader to the program. glAttachShader(programObjectId, fragmentShaderId); // 将两个着色器连接成一个program glLinkProgram(programObjectId); // 获取连接状态 final int[] linkStatus = new int[1]; glGetProgramiv(programObjectId, GL_LINK_STATUS, linkStatus, 0); if (LoggerConfig.ON) { // Print the program info log to the Android log output. Log.v( TAG, "Results of linking program:\n" + glGetProgramInfoLog(programObjectId)); } // 验证连接状态 if (linkStatus[0] == 0) { // If it failed, delete the program object. glDeleteProgram(programObjectId); if (LoggerConfig.ON) { Log.w(TAG, "连接 program 失败!."); } return 0; } // Return the program object ID. return programObjectId; } /** * Validates an OpenGL program. Should only be called when developing the * application. */ public static boolean validateProgram(int programObjectId) { glValidateProgram(programObjectId); final int[] validateStatus = new int[1]; glGetProgramiv(programObjectId, GL_VALIDATE_STATUS, validateStatus, 0); Log.v(TAG, "Results of validating program: " + validateStatus[0] + "\nLog:" + glGetProgramInfoLog(programObjectId)); return validateStatus[0] != 0; } /** * /** * 编译,连接 ,返回 program 的 ID * @param vertexShaderSource * @param fragmentShaderSource * @return */ public static int buildProgram(String vertexShaderSource, String fragmentShaderSource) { int program; // Compile the shaders. int vertexShader = compileVertexShader(vertexShaderSource); int fragmentShader = compileFragmentShader(fragmentShaderSource); // Link them into a shader program. program = linkProgram(vertexShader, fragmentShader); if (LoggerConfig.ON) { validateProgram(program); } return program; } }
likesyour 2017-06-29
  • 打赏
  • 举报
回复
public class MyGlsurfaceView extends GLSurfaceView implements GLSurfaceView.Renderer{ private Context context; private Square square; public MyGlsurfaceView(Context context) { super(context); this.context = context; setEGLContextClientVersion(2); setRenderer(this); } @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { //First:设置清空屏幕用的颜色,前三个参数对应红绿蓝,最后一个对应alpha glClearColor(1.0f, 1.0f, 1.0f, 1.0f); square = new Square(context); } @Override public void onSurfaceChanged(GL10 gl, int width, int height) { glViewport(0,0,width,height); } @Override public void onDrawFrame(GL10 gl) { //Third:清空屏幕,擦除屏幕上所有的颜色,并用之前glClearColor定义的颜色填充整个屏幕 glClear(GL_COLOR_BUFFER_BIT); //绘制三角形 square.draw(); } }
likesyour 2017-06-29
  • 打赏
  • 举报
回复
请问你的render在哪里

80,362

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧