c ++ opengl es 2.0 - 创建矩形和圆形 [英] c++ opengl es 2.0 - create rectangle and circle

查看:85
本文介绍了c ++ opengl es 2.0 - 创建矩形和圆形的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

嗨;



我在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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆