c ++ opengl es 2.0 - 创建矩形和圆形 [英] c++ opengl es 2.0 - create rectangle and circle
问题描述
嗨;
我在openGL中使用此代码,但是我想消除glbegin和glend以符合OpenGL ES标准。
任何人都可以帮忙吗?谢谢
#include painter.hpp
#include GL / glut.h
void Painter :: bar( int x1, int y1, int x2, int y2)
{
glColor3f( 0 , 1 , 0 跨度>);
glBegin(GL_QUADS);
glVertex2f(x1,y1);
glVertex2f(x2,y1);
glVertex2f(x2,y2);
glVertex2f(x1,y2);
glEnd();
}
void Painter :: circle( int x, int y, int radius)
{
glColor3f( 1 , 0 , 0 );
glBegin(GL_POLYGON);
glVertex2f(x + radius,y);
glVertex2f(x,y + radius);
glVertex2f(x - radius,y);
glVertex2f(x,y - radius);
glEnd();
}
在OpenGL ES 2.0中,不支持GL_QUADS和GL_POLYGON。 OpenGL ES 2.0中也禁用了固定功能管道。您需要创建着色器程序,并使用此程序附加顶点着色器和像素着色器。然后将顶点数据设置为该程序。
以下是OpenGLES2.0中的示例代码。
顶点着色器源
// 顶点着色器程序。
属性vec4职位;
属性vec4 SourceColor;
改变vec4 DestinationColor;
void main( void )
{
DestinationColor = SourceColor;
gl_Position =位置;
}
像素着色器源
// 像素着色器。
改变lowp vec4 DestinationColor;
void main( void )
{
gl_FragColor = DestinationColor;
}
设置顶点数据
private final float TriangleVerticesData [] =
{ // X,Y,Z,
- 1 .0f, - 1 .0f, 0 .0f,
- 1 .0f, 1 .0f, 0 .ff,
1 .0f, - 1 .0f, 0 .0f,
1 .0f, 1 .0f, 0 .0f,};
ByteBuffer temp = ByteBuffer.allocateDirect(TriangleVerticesData.length * 4 );
temp.order(ByteOrder.nativeOrder());
mTriangleVertices = temp.asFloatBuffer();
mTriangleVertices.put(TriangleVerticesData).position( 0 );
准备着色器程序
// 准备程序,顶点和像素着色器设置。
nShaderProgram = GLES20.glCreateProgram();
// 顶点着色器
int VSshader = GLES20.glCreateShader(GLES20.GL_VERTEX_SHADER);
GLES20.glShaderSource(VSshader,VSshaderSource);
GLES20.glCompileShader(VSshader);
int 编译[] = new int [ 1 ];
GLES20.glGetShaderiv(着色器,GLES20.GL_COMPILE_STATUS,已编译, 0 );
if ( 0 ==编译[ 0 ]){ // 编译失败。
GLES20.glDeleteShader(着色器) ;
shader = 0 ;
}
// 像素着色器。
int PSshader = GLES20.glCreateShader(GLES20.GL_PIXEL_SHADER);
GLES20.glShaderSource(VSshader,PSshaderSource);
GLES20.glCompileShader(PSshader);
{
int 编译[] = 新 int [ 1 ];
GLES20.glGetShaderiv(着色器,GLES20.GL_COMPILE_STATUS,已编译, 0 );
if ( 0 ==编译[ 0 ]){ // 编译失败。
GLES20.glDeleteShader(着色器) ;
shader = 0 ;
}
}
绑定顶点数据并将四边形画到屏幕上。
GLES20.glUseProgram(nShaderProgram);
int nParam = GLES20.glGetAttribLocation(nShaderProgram, 职位);
mTriangleVertices.position( 0 );
GLES20.glVertexAttribPointer(nParam, 3 ,GLES20.GL_FLOAT, false ,
4 * sizeof (, // < span class =code-comment> 3个顶点的3个顶点
mTriangleVertices);
GLES20.glEnableVertexAttribArray(nParam);
// Draw
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
GLES20.glDrawArrays( GLES20.GL_TRIANGLE_STRIP, 0 , 4 );
在OpenGLES 2.0中也允许GL_POLYGON,因此你必须为POLYGON
对象准备等效的顶点缓冲区。
有关详细信息,请参阅以下链接ls。
http:// developer。 android.com/training/graphics/opengl/draw.html
Hi;
I have this code in openGL, which works, but I would like to eliminate the glbegin and glend to meet OpenGL ES standards.
Can anyone out there help? Thanks
#include "painter.hpp"
#include "GL/glut.h"
void Painter::bar(int x1, int y1, int x2, int y2)
{
glColor3f(0, 1, 0);
glBegin(GL_QUADS);
glVertex2f(x1, y1);
glVertex2f(x2, y1);
glVertex2f(x2, y2);
glVertex2f(x1, y2);
glEnd();
}
void Painter::circle(int x, int y, int radius)
{
glColor3f(1, 0, 0);
glBegin(GL_POLYGON);
glVertex2f(x + radius, y);
glVertex2f(x, y + radius);
glVertex2f(x - radius, y);
glVertex2f(x, y - radius);
glEnd();
}
In OpenGL ES 2.0, GL_QUADS and GL_POLYGON is not supported. Also fixed function pipeline is disabled in OpenGL ES 2.0. You need to create a shader program, and attach vertex shader and pixel shader with this program. Then set vertex data to the this program.
Here is a sample code in OpenGLES2.0.
Vertex shader source
// Vertex shader program. attribute vec4 Position; attribute vec4 SourceColor; varying vec4 DestinationColor; void main(void) { DestinationColor = SourceColor; gl_Position = Position; }
Pixel shader source
// Pixel shader. varying lowp vec4 DestinationColor; void main(void) { gl_FragColor = DestinationColor; }
Setup vertex data
private final float TriangleVerticesData[] = {// X, Y, Z, -1.0f, -1.0f, 0.0f, -1.0f, 1.0f, 0.0f, 1.0f, -1.0f, 0.0f, 1.0f, 1.0f, 0.0f,}; ByteBuffer temp = ByteBuffer.allocateDirect( TriangleVerticesData.length * 4); temp.order( ByteOrder.nativeOrder()); mTriangleVertices = temp.asFloatBuffer(); mTriangleVertices.put( TriangleVerticesData ).position( 0 );
Prepare shader program
// Prepare program, vertex and pixel shader setup. nShaderProgram = GLES20.glCreateProgram(); // Vertex shader int VSshader = GLES20.glCreateShader( GLES20.GL_VERTEX_SHADER ); GLES20.glShaderSource( VSshader, VSshaderSource); GLES20.glCompileShader( VSshader ); int compiled[] = new int[1]; GLES20.glGetShaderiv( shader, GLES20.GL_COMPILE_STATUS, compiled, 0 ); if ( 0 == compiled[0] ) { // compilation failed. GLES20.glDeleteShader( shader ); shader = 0; } // Pixel shader. int PSshader = GLES20.glCreateShader( GLES20.GL_PIXEL_SHADER ); GLES20.glShaderSource( VSshader, PSshaderSource); GLES20.glCompileShader( PSshader ); { int compiled[] = new int[1]; GLES20.glGetShaderiv( shader, GLES20.GL_COMPILE_STATUS, compiled, 0 ); if ( 0 == compiled[0] ) { // compilation failed. GLES20.glDeleteShader( shader ); shader = 0; } }
Bind vertex data and draw quad to screen.
GLES20.glUseProgram( nShaderProgram ); int nParam = GLES20.glGetAttribLocation( nShaderProgram, "Position" ); mTriangleVertices.position( 0); GLES20.glVertexAttribPointer( nParam, 3, GLES20.GL_FLOAT, false, 4 * sizeof(, // 3 vertices for 4 vertices mTriangleVertices ); GLES20.glEnableVertexAttribArray( nParam ); // Draw GLES20.glClear( GLES20.GL_COLOR_BUFFER_BIT ); GLES20.glDrawArrays( GLES20.GL_TRIANGLE_STRIP, 0, 4 );
GL_POLYGON is also allowed in OpenGLES 2.0, therefore you have to prepare equivalent vertex buffers for the POLYGON
object.
Please refer following link for more details.
http://developer.android.com/training/graphics/opengl/draw.html
这篇关于c ++ opengl es 2.0 - 创建矩形和圆形的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!