用OpenGL ES绘制一个彩色的三角形

原创 2013年03月13日 22:14:53

以下均转自Android游戏编程入门经典,转载请标明出处

通过使用glColor4f()为所有的顶点设置一个全局默认颜色。但有时需要更多细粒度的控制(例如,需要为每个顶点设置颜色)。

OpenGL ES提供这样的功能,需要的只是将RGBA浮点分量加到每个顶点,并告诉OpenGL ES在哪里可以找到每个顶点的颜色。

int VERTEX_SIZE = (2 + 4) * 4;
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(3 * VERTEX_SIZE);
			byteBuffer.order(ByteOrder.nativeOrder());
			vertices = byteBuffer.asFloatBuffer();
			vertices.put(new float[]{
					  0.0f,   0.0f, 1, 0, 0, 1,
					319.0f,   0.0f, 0, 1, 0, 1,
					160.0f, 479.0f, 0, 0, 1, 1
			});

每个顶点需要两个坐标和4个(RGBA)颜色分量,因此一共需要6个浮点数。每个浮点数占4个字节,也就是说,一个顶点需要24个字节。当调用ByteBuffer.allocateDirect()方法时,只需把顶点数乘以VERTEX_SIZE就可得到需要的ByteBuffer空间。

如果需要渲染它,就必须告诉OpenGL ES这些顶点不但有位置信息,还有颜色属性。

gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_COLOR_ARRAY);

现在OpenGL ES知道它可以得到每个顶点的位置和颜色信息,还需要告诉它从哪里可以获得这些信息:

vertices.position(0);
gl.glVertexPointer(2, GL10.GL_FLOAT, VERTEX_SIZE, vertices);
vertices.position(2);
gl.glColorPointer(4, GL10.GL_FLOAT, VERTEX_SIZE, vertices);

首先设置FloatBuffer的位置。FloatBuffer从0开始保存这些顶点。这个位置指向缓冲区第一个顶点的x坐标。接下来调用glVertexPointer()方法。唯一与前面实例不同的地方是这里需要指明顶点的大小(以字节为单位)。OpenGL ES将从指定的缓冲区的起始位置读取顶点位置。第一个顶点位置的地址增加VERTEX_SIZE字节后得到第二个顶点位置的地址,以此类推。

接下来,设置第一个顶点的R颜色分量在缓冲区中的位置并调用glColorPointer()方法,该方法告诉OpenGL ES在哪里可以找到顶点的颜色。第一个参数是每个颜色的分量数。分量数一直是4.第二个参数指明每个分量的类型,用GL10.GL_FLOAT来声明每个颜色分量都是浮点型,并且取值范围是0~1.第三个参数是顶点颜色间的步长。最后一个参数是顶点缓冲区。

只要在调用glColorPointer()之前调用vertices.position(2),OpenGL ES就会知道第一个顶点的颜色是从缓冲区中的第三个浮点数开始的。如果位置不设为2,OpenGL ES将从位置0开始读取颜色值。

package org.example.androidgames.glbasics;

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

import javax.microedition.khronos.opengles.GL10;

import org.example.androidgames.framework.Game;
import org.example.androidgames.framework.Screen;
import org.example.androidgames.framework.impl.GLGame;
import org.example.androidgames.framework.impl.GLGraphics;

public class ColoredTriangleTest extends GLGame{

	@Override
	public Screen getStartScreen() {
		// TODO Auto-generated method stub
		return new ColoredTriangleScreen(this);
	}
	
	class ColoredTriangleScreen extends Screen {
		final int VERTEX_SIZE = (2 + 4) * 4;
		GLGraphics glGraphics;
		FloatBuffer vertices;

		public ColoredTriangleScreen(Game game) {
			super(game);
			glGraphics = ((GLGame)game).getGLGraphics();
			
			ByteBuffer byteBuffer = ByteBuffer.allocateDirect(3 * VERTEX_SIZE);
			byteBuffer.order(ByteOrder.nativeOrder());
			vertices = byteBuffer.asFloatBuffer();
			vertices.put(new float[]{
					  0.0f,   0.0f, 1, 0, 0, 1,
					319.0f,   0.0f, 0, 1, 0, 1,
					160.0f, 479.0f, 0, 0, 1, 1
			});
		}

		@Override
		public void update(float deltaTime) {
			// TODO Auto-generated method stub

		}

		@Override
		public void present(float deltaTime) {
			// TODO Auto-generated method stub
			GL10 gl = glGraphics.getGL();
			gl.glViewport(0, 0, glGraphics.getWidth(), glGraphics.getHeight());
			gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
			gl.glMatrixMode(GL10.GL_PROJECTION);
			gl.glLoadIdentity();
			gl.glOrthof(0, 320, 0, 480, 1, -1);
			
			gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
			gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
			
			vertices.position(0);
			gl.glVertexPointer(2, GL10.GL_FLOAT, VERTEX_SIZE, vertices);
			vertices.position(2);
			gl.glColorPointer(4, GL10.GL_FLOAT, VERTEX_SIZE, vertices);
			gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
		}

		@Override
		public void pause() {
			// TODO Auto-generated method stub

		}

		@Override
		public void resume() {
			// TODO Auto-generated method stub

		}

		@Override
		public void dispose() {
			// TODO Auto-generated method stub

		}

	}
	
}

运行效果如下:
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wangdong20/article/details/8670666

OpenGL实验(一)彩色五角星绘制

Open Graphics Library (OpenGL)
  • birdy_
  • birdy_
  • 2017-03-27 16:48:41
  • 1188

opengles绘制可旋转的六角星

package com.bn.Sample5_1; import android.opengl.Matrix; //存储系统矩阵状态的类 public class MatrixState { ...
  • hb707934728
  • hb707934728
  • 2016-08-01 15:22:25
  • 889

整理 qt opengl,自己的基础框架 —— 绘制一个彩色三角形

网上很多都是QGLWidget例子,而cube,虽然说明文档上说再简单不过了,但是对于一个0基础的来说,还是像看天书一样。opengl的例子还有一个hellgl2,看着比较简单,但是那个log生成的代...
  • imxiangzi
  • imxiangzi
  • 2016-09-24 14:31:33
  • 876

使用<em>openGL绘制六角星</em>

使用<em>openGL绘制六角星</em>。程序简单,清晰易懂。... <em>OpenGL</em>实验(一)<em>彩色</em>五<em>角星绘制</em> opengles绘制可旋转的<em>六角星</em> <em>OpenGL</em>实验(一)<em>彩色</em>五<em>角星绘制</em> 计算机图形学——<em>Open</em>...
  • 2018年04月13日 00:00

<em>OPENGL</em> 画颜色渐变<em>六角星</em>+旋转

基于<em>OpenGL</em>的编程~~~ 实验一:画颜色渐变的<em>六角星</em>左键控制旋转右键控制停止... 画颜色渐变的<em>六角星</em>左键控制旋转右键控制...<em>OpenGL</em>实验(一)<em>彩色</em>五<em>角星绘制</em> <em>openGL</em>两...
  • 2018年04月15日 00:00

android opengl es基本操作,画线,三角形,正方形,颜色设置

上篇文章讲了opengl es的基本知识,GLSurfaceView的创建,画点等内容,这篇文章将opengl es另外的一些基本操作,比如画线,画三角形,正方形等,以及这些例子中涉及到了相关的知识点...
  • u012761326
  • u012761326
  • 2017-02-21 14:32:33
  • 2551

Android OpenGL ES学习笔记之绘制一个立方体

前言前面已经讲了如何绘制点、线、面,现在就来绘制一个立方体,OpenGL ES中任何一个立体图形都是由很多面组成的,这个面指的就是三角形,所以绘制立方体就是绘制多个三角形而组合起来。绘制立方体有6个面...
  • qq_31530015
  • qq_31530015
  • 2016-08-10 10:29:34
  • 3778

<em>openGL</em>两方法<em>绘制六角星</em>及上色

用两种方法实现<em>六角星</em>的绘制,为每个顶点上一个颜色,并实现渐变。... 用两种方法实现<em>六角星</em>的绘制,为每个顶点上一个...<em>OpenGL</em>实验(一)<em>彩色</em>五<em>角星绘制</em> 一个简单的<em>O</em>...
  • 2018年04月13日 00:00

用OpenGL ES绘制一个彩色的三角形

以下均转自Android游戏编程入门经典,转载请标明出处 通过使用glColor4f()为所有的顶点设置一个全局默认颜色。但有时需要更多细粒度的控制(例如,需要为每个顶点设置颜色)。 OpenGL...
  • wangdong20
  • wangdong20
  • 2013-03-13 22:14:53
  • 1928

Android openGL ES 2.0入门--画三角形、正方形

因为最近的项目需要用到openGL ES 2.0,折腾了半天,查了网上一大堆资料,都没找到系统的openGL ES 2.0的学习资料。经过这半天,总算自己写了一个可以画出三角形和正方形的代码,顺便对网...
  • code_better
  • code_better
  • 2016-08-01 21:46:35
  • 1971
收藏助手
不良信息举报
您举报文章:用OpenGL ES绘制一个彩色的三角形
举报原因:
原因补充:

(最多只允许输入30个字)