安卓的OpenGL ES 2,绘图方块 [英] Android OpenGL ES 2, Drawing squares
问题描述
编辑:问题解决的 所以,我一直在经历了官方的OpenGL ES 2教程为Android,我已经得到了涉及绘制形状的一部分,但我似乎无法得到方形的工作。它吸引了一个直角三角形来代替。
我已经包括了我使用的定义和绘制形状,这是从本教程复制几乎完全code。该渲染器类简单地创建这种形状的实例,并调用draw方法。
由于某些原因,本教程不给的值/声明vertexStride和vertexCount,所以那些我在那里的猜测。我试过几个值vertexCount(1至12),并没有工作。
在此先感谢。
公共类方{
私人FloatBuffer vertexBuffer;
私人ShortBuffer drawListBuffer;
//此数组中每个顶点的坐标数量
静态最终诠释COORDS_PER_VERTEX = 3;
静浮squareCoords [] = {-0.5f,0.5F,0.0,//左上
-0.5f,-0.5f,0.0,//左下
0.5F,-0.5f,0.0,//右下
0.5F,0.5F,0.0}; // 右上
私人短DRAWORDER [] = {0,1,2,0,2,3}; //为了绘制顶点
浮色[] = {0.63671875f,0.76953125f,0.22265625f,1.0F};
私人最终字符串vertexShader code =
属性vec4 vPosition; +
无效的主要(){+
GL_POSITION = vPosition; +
};
私人最终字符串fragmentShader code =
precision mediump浮动; +
统一vec4 vColor; +
无效的主要(){+
gl_FragColor = vColor; +
};
INT mProgram;
静态最终诠释vertexStride = COORDS_PER_VERTEX * 4;
静态最终诠释vertexCount = 4;
市民广场(){
//初始化为形状坐标顶点字节的缓冲区
ByteBuffer的BB = ByteBuffer.allocateDirect(squareCoords.length * 4); //(#坐标值* 4%的浮动字节)
bb.order(ByteOrder.nativeOrder());
vertexBuffer = bb.asFloatBuffer();
vertexBuffer.put(squareCoords);
vertexBuffer.position(0);
//初始化字节的缓冲区的抽奖名单
ByteBuffer的DLB = ByteBuffer.allocateDirect(drawOrder.length * 2); //(#坐标值的每个短* 2字节)
dlb.order(ByteOrder.nativeOrder());
drawListBuffer = dlb.asShortBuffer();
drawListBuffer.put(DRAWORDER);
drawListBuffer.position(0);
INT vertexShader = loadShader(GLES20.GL_VERTEX_SHADER,vertexShader code);
INT fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER,fragmentShader code);
mProgram = GLES20.glCreateProgram(); //创建空的OpenGL ES项目
GLES20.glAttachShader(mProgram,vertexShader); //添加顶点着色器程序
GLES20.glAttachShader(mProgram,fragmentShader); //添加片段着色器进行编程
GLES20.glLinkProgram(mProgram); //创建OpenGL ES的可执行程序
}
公共静态INT loadShader(整型,字符串着色器code){
//创建一个顶点着色器类型(GLES20.GL_VERTEX_SHADER)
//或片段着色器类型(GLES20.GL_FRAGMENT_SHADER)
INT着色器= GLES20.glCreateShader(类型);
//添加源$ C $ C到着色器和编译
GLES20.glShaderSource(着色,着色器code);
GLES20.glCompileShader(着色);
返回着色器;
}
公共无效平局(){
//添加程序OpenGL ES的环境
GLES20.glUseProgram(mProgram);
//得到处理到顶点着色器的vPosition成员
INT mPositionHandle = GLES20.glGetAttribLocation(mProgramvPosition);
//启用句柄三角形顶点
GLES20.glEnableVertexAttribArray(mPositionHandle);
// prepare三角坐标数据
GLES20.glVertexAttribPointer(mPositionHandle,COORDS_PER_VERTEX,
GLES20.GL_FLOAT,假的,
vertexStride,vertexBuffer);
//得到处理,以片段着色器的vColor成员
INT mColorHandle = GLES20.glGetUniformLocation(mProgramvColor);
//设置颜色绘制三角形
GLES20.glUniform4fv(mColorHandle,1,颜色,0);
//绘制三角形
GLES20.glDrawArrays(GLES20.GL_TRIANGLES,0,vertexCount);
//禁用顶点数组
GLES20.glDisableVertexAttribArray(mPositionHandle);
}
}
vertexCount = squareCoords.length / COORDS_PER_VERTEX; //顶点计数是阵列由顶点前的大小划分。 (X,Y)或(X,Y,Z)
vertexStride = COORDS_PER_VERTEX * 4; // 4是在浮法多少字节
让我知道这是否制定了你,祝你好运。
我觉得你还缺少 ModelViewProjection
矩阵用于三维空间转换到2D屏幕空间。 mvpMatrix应该由绘制函数画中传递(浮动[] mvpMatrix)
忘了提,你也应该使用 DrawElements(...)
(示例中使用)如果你没有必要为计数或步幅,一个idicies数组只是长度和绘图缓冲器。
//获取处理到图形的变换矩阵
mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgramuMVPMatrix);
//应用投影和视图变换
GLES20.glUniformMatrix4fv(mMVPMatrixHandle,1,假的,mvpMatrix,0);
//绘制正方形
GLES20.glDrawElements(GLES20.GL_TRIANGLES,drawOrder.length,
GLES20.GL_UNSIGNED_SHORT,drawListBuffer);
EDIT: Problem solved! So I've been going through the official OpenGL ES 2 tutorials for Android, and I've gotten to the part that involves drawing shapes, but I can't seem to get a square to work. It draws a right triangle instead.
I've included the code that I'm using to define and draw the shape, which is copied almost exactly from the tutorial. The Renderer class simply creates an instance of this shape and calls the draw method.
For some reason, the tutorial does not give the values/declaration for vertexStride and vertexCount, so the ones I have in there are educated guesses. I've tried several values for vertexCount (1 thru 12), and none work.
Thanks in advance.
public class Square {
private FloatBuffer vertexBuffer;
private ShortBuffer drawListBuffer;
// number of coordinates per vertex in this array
static final int COORDS_PER_VERTEX = 3;
static float squareCoords[] = { -0.5f, 0.5f, 0.0f, // top left
-0.5f, -0.5f, 0.0f, // bottom left
0.5f, -0.5f, 0.0f, // bottom right
0.5f, 0.5f, 0.0f }; // top right
private short drawOrder[] = { 0, 1, 2, 0, 2, 3 }; // order to draw vertices
float color[] = { 0.63671875f, 0.76953125f, 0.22265625f, 1.0f };
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;" +
"}";
int mProgram;
static final int vertexStride = COORDS_PER_VERTEX * 4;
static final int vertexCount = 4;
public Square() {
// initialize vertex byte buffer for shape coordinates
ByteBuffer bb = ByteBuffer.allocateDirect(squareCoords.length * 4); // (# of coordinate values * 4 bytes per float)
bb.order(ByteOrder.nativeOrder());
vertexBuffer = bb.asFloatBuffer();
vertexBuffer.put(squareCoords);
vertexBuffer.position(0);
// initialize byte buffer for the draw list
ByteBuffer dlb = ByteBuffer.allocateDirect(drawOrder.length * 2); // (# of coordinate values * 2 bytes per short)
dlb.order(ByteOrder.nativeOrder());
drawListBuffer = dlb.asShortBuffer();
drawListBuffer.put(drawOrder);
drawListBuffer.position(0);
int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexShaderCode);
int fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentShaderCode);
mProgram = GLES20.glCreateProgram(); // create empty OpenGL ES Program
GLES20.glAttachShader(mProgram, vertexShader); // add the vertex shader to program
GLES20.glAttachShader(mProgram, fragmentShader); // add the fragment shader to program
GLES20.glLinkProgram(mProgram); // creates OpenGL ES program executables
}
public static int loadShader(int type, String shaderCode){
// create a vertex shader type (GLES20.GL_VERTEX_SHADER)
// or a fragment shader type (GLES20.GL_FRAGMENT_SHADER)
int shader = GLES20.glCreateShader(type);
// add the source code to the shader and compile it
GLES20.glShaderSource(shader, shaderCode);
GLES20.glCompileShader(shader);
return shader;
}
public void draw() {
// Add program to OpenGL ES environment
GLES20.glUseProgram(mProgram);
// get handle to vertex shader's vPosition member
int mPositionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition");
// Enable a handle to the triangle vertices
GLES20.glEnableVertexAttribArray(mPositionHandle);
// Prepare the triangle coordinate data
GLES20.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX,
GLES20.GL_FLOAT, false,
vertexStride, vertexBuffer);
// get handle to fragment shader's vColor member
int mColorHandle = GLES20.glGetUniformLocation(mProgram, "vColor");
// Set color for drawing the triangle
GLES20.glUniform4fv(mColorHandle, 1, color, 0);
// Draw the triangle
GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount);
// Disable vertex array
GLES20.glDisableVertexAttribArray(mPositionHandle);
}
}
vertexCount = squareCoords.length/COORDS_PER_VERTEX; //Vertex count is the array divided by the size of the vertex ex. (x,y) or (x,y,z)
vertexStride = COORDS_PER_VERTEX * 4; //4 are how many bytes in a float
Let me know if that worked out for you, good luck.
I think your also missing the ModelViewProjection
Matrix used to convert 3D space to 2D screen space. mvpMatrix should be passed in by the draw function draw(float[] mvpMatrix)
Forgot to mention you also should use DrawElements(...)
(used in example) if you do there's no need for the count or stride, just the length of an idicies array and a drawing buffer.
// Get handle to shape's transformation matrix
mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");
// Apply the projection and view transformation
GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0);
// Draw the square
GLES20.glDrawElements(GLES20.GL_TRIANGLES, drawOrder.length,
GLES20.GL_UNSIGNED_SHORT, drawListBuffer);
这篇关于安卓的OpenGL ES 2,绘图方块的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!