opengles绘制圆锥体(光照+纹理)

效果图


圆面的绘制

package test.com.opengles8_2;

/**
 * Created by hbin on 2016/9/7.
 */

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import android.opengl.GLES20;


public class Circle {
    int mProgram;//自定义渲染管线着色器程序id
    int muMVPMatrixHandle;//总变换矩阵引用
    int maPositionHandle; //顶点位置属性引用
    int maTexCoorHandle; //顶点纹理坐标属性引用
    int muMMatrixHandle;

    int maCameraHandle; //摄像机位置属性引用
    int maNormalHandle; //顶点法向量属性引用
    int maLightLocationHandle;//光源位置属性引用


    String mVertexShader;//顶点着色器代码脚本
    String mFragmentShader;//片元着色器代码脚本

    FloatBuffer   mVertexBuffer;//顶点坐标数据缓冲
    FloatBuffer   mTexCoorBuffer;//顶点纹理坐标数据缓冲
    FloatBuffer   mNormalBuffer;//顶点法向量数据缓冲
    int vCount=0;
    float xAngle=0;//绕x轴旋转的角度
    float yAngle=0;//绕y轴旋转的角度
    float zAngle=0;//绕z轴旋转的角度

    public Circle(MySurfaceView mv,float scale,float r,int n)
    {
        //调用初始化顶点数据的initVertexData方法
        initVertexData(scale,r,n);
        //调用初始化着色器的intShader方法
        initShader(mv);
    }

    //自定义的初始化顶点数据的方法
    public void initVertexData(
            float scale,	//大小
            float r,		//半径
            int n)		//切分的份数
    {
        r=r*scale;
        float angdegSpan=360.0f/n;	//顶角的度数
        vCount=3*n;//顶点个数,共有n个三角形,每个三角形都有三个顶点

        float[] vertices=new float[vCount*3];//坐标数据
        float[] textures=new float[vCount*2];//顶点纹理S、T坐标值数组
        //坐标数据初始化
        int count=0;
        int stCount=0;
        for(float angdeg=0;Math.ceil(angdeg)<360;angdeg+=angdegSpan)
        {
            double angrad=Math.toRadians(angdeg);//当前弧度
            double angradNext=Math.toRadians(angdeg+angdegSpan);//下一弧度
            //中心点
            vertices[count++]=0;//顶点坐标
            vertices[count++]=0;
            vertices[count++]=0;

            textures[stCount++]=0.5f;//st坐标
            textures[stCount++]=0.5f;
            //当前点
            vertices[count++]=(float) (-r*Math.sin(angrad));//顶点坐标
            vertices[count++]=(float) (r*Math.cos(angrad));
            vertices[count++]=0;

            textures[stCount++]=(float) (0.5f-0.5f
  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要使用OpenGL绘制金字塔并进行缩放、光照纹理,可以按照以下步骤进行: 1. 定义金字塔的顶点坐标和法向量,并将它们存储在顶点缓冲区中。 2. 使用OpenGL的透投影矩阵将3D场景投影到2D屏幕上,可以使用gluPerspective函数来实现。 3. 使用glMatrixMode函数将矩阵模式设置为GL_MODELVIEW,然后使用glLoadIdentity函数将当前矩阵重置为单位矩阵。 4. 使用glTranslatef函数将金字塔移动到屏幕中心位置。 5. 使用glRotatef函数对金字塔进行旋转,可以通过修改旋转角度和轴向来实现不同的旋转效果。 6. 使用glScalef函数对金字塔进行缩放,可以通过修改缩放因子来实现不同的缩放效果。 7. 使用glEnable(GL_LIGHTING)函数启用光照,并使用glShadeModel(GL_SMOOTH)函数设置光照模式为平滑模式。 8. 使用glEnable(GL_LIGHT0)函数启用光源0,并设置光源0的位置和颜色。 9. 在渲染循环中,使用glClear函数清空屏幕,并使用glBindTexture函数绑定纹理,然后使用glDrawArrays函数绘制金字塔。 以下是一个简单的OpenGL程序示例,用于绘制一个带有缩放、光照纹理的金字塔: ```C++ #include <GL/glut.h> #include <SOIL/SOIL.h> GLuint texture; GLfloat angle = 0.0; GLfloat scale = 1.0; void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluPerspective(60, 1, 0.1, 100); glTranslatef(0, 0, -5); glRotatef(angle, 0, 1, 0); glScalef(scale, scale, scale); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); GLfloat light_position[] = { -1.0, 1.0, -1.0, 0.0 }; GLfloat light_color[] = { 1.0, 1.0, 1.0, 1.0 }; glLightfv(GL_LIGHT0, GL_POSITION, light_position); glLightfv(GL_LIGHT0, GL_DIFFUSE, light_color); glBindTexture(GL_TEXTURE_2D, texture); glBegin(GL_TRIANGLES); // 绘制金字塔 glEnd(); glFlush(); } void init() { // 加载纹理 texture = SOIL_load_OGL_texture("texture.png", SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID, SOIL_FLAG_INVERT_Y); glBindTexture(GL_TEXTURE_2D, texture); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glEnable(GL_TEXTURE_2D); glEnable(GL_DEPTH_TEST); } void idle() { angle += 0.5; if (angle > 360) angle -= 360; scale += 0.01; if (scale > 1.5) scale = 1.0; glutPostRedisplay(); } int main(int argc, char * argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(400, 400); glutCreateWindow("Pyramid"); glutDisplayFunc(display); glutIdleFunc(idle); init(); glutMainLoop(); return 0; } ``` 在上面的示例中,我们使用gluPerspective函数设置透投影矩阵,glTranslatef函数将金字塔移动到屏幕中心位置,glRotatef函数对金字塔进行旋转,glScalef函数对金字塔进行缩放。在渲染循环中,我们使用glClear函数清空屏幕,并使用glBindTexture函数绑定纹理,然后使用glDrawArrays函数绘制金字塔。我们还使用glEnable(GL_LIGHTING)函数启用光照,使用glEnable(GL_LIGHT0)函数启用光源0,并设置光源0的位置和颜色。在idle函数中,我们修改旋转角度和缩放因子,以实现动态效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值