我要发帖 回复

中级会员

27

主题

124

积分

0

专家分

:

私信
发表时间 : 2009-7-4 11:24:21 | 浏览 : 1903    评论 : 3
我采用了glDrawElements来绘制图形,现在遇到的问题是:如果存储顶点坐标的空间是一个动态开辟的数组的话,绘制出来的图形变形了,是不是顶点数组方法中存储顶点坐标的数组不能是动态开辟的?为什么?

最近VR访客

tan_dunming 评论于2009-7-4 15:15:26
动态开辟的应该也可以吧 是不是后面把动态申请的内存空间释放了呢 还是其他问题? 要不行上传代码看看?
追求卓越
yaojianfu 评论于2009-7-5 21:49:41
tan_dunming 评论于2009-7-7 16:55:50
这几天一直比较忙 今天下午刚准备完项目验收文档 在你上传的程序的基础上稍作了一些修改
我比较推崇《OpenGL编程指南》中关于顶点数组的使用方法 也是参考那本书的范例修改的 建议你也查阅一下书籍的介绍
其实 现在使用顶点缓冲 Vertex Buffer效率更高 具体的例程可以参考NEHE教程

不废话了 贴上源码如下 我使用的是一维数组
  1. #include "windows.h"
  2. #include "glut.h"
  3. #include "stdio.h"
  4. #include "stdlib.h"
  5. #include "math.h"
  6. //////////////////////////////////////////////////////////////////////////
  7. //下面的代码是静态数组,用以存贮顶点坐标
  8. // GLint pt[12]={0,0,0,0,100,0,100,0,0,100,100,0,};
  9. //////////////////////////////////////////////////////////////////////////
  10. int * pt;

  11. void Cube_2()
  12. {
  13.         glEnableClientState(GL_VERTEX_ARRAY);
  14.         //激活顶点数组特性
  15.         glVertexPointer(3,GL_INT,0,pt);

  16.         glDrawArrays (GL_TRIANGLE_STRIP, 0, 4);
  17.         
  18.         //关闭顶点数组特性
  19.         glDisableClientState(GL_VERTEX_ARRAY);
  20.         
  21. }
  22. void Painting(void)
  23. {
  24.         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//用背景色刷新显示窗口
  25.         glColor3f(1.0,0.0,0.0);//设置图元颜色

  26.         Cube_2();

  27.         glFlush();
  28. }

  29. void main(int argc, char** argv)
  30. {
  31.         // TODO: Add your control notification handler code here
  32.         int winWidth=300, winHeight=300;

  33.         //////////////////////////////////////////////////////////////////////////
  34.         //下面的代码是动态开辟了一个一维数组并初始化,存贮了顶点坐标
  35.         pt=new int [12];
  36.                 pt[0]=0;
  37.                 pt[1]=0;
  38.                 pt[2]=0;

  39.                 pt[3]=0;
  40.                 pt[4]=100;
  41.                 pt[5]=0;

  42.                 pt[6]=100;
  43.                 pt[7]=0;
  44.                 pt[8]=0;

  45.                 pt[9]=100;
  46.                 pt[10]=100;
  47.                 pt[11]=0;
  48.         //////////////////////////////////////////////////////////////////////////
  49.         glutInit(&argc,argv);
  50.         //完成GLUT初始化
  51.         glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
  52.         //设定显示窗口的缓存和颜色模型
  53.         glutInitWindowPosition(50,100);
  54.         //确定显示窗口左上角初始位置
  55.         glutInitWindowSize(winWidth,winHeight);
  56.         //确定显示窗口的大小
  57.         glutCreateWindow("example");
  58.         //给定创建显示窗口的标题

  59.         glClearColor(1.0,1.0,1.0,0.0);
  60.         //确定背景颜色 和 调和参数(为两个重叠对象确定结果颜色:0-完全透明,1-不透明)

  61.         gluLookAt(0.0,0.0,400.0,  0.0,0.0,0.0,  0.0,1.0,0.0);
  62.         //站在哪里 往哪看 向上向量
  63.         glMatrixMode(GL_PROJECTION);
  64.         gluPerspective(30, GLdouble(winWidth)/GLdouble(winHeight), 1.0, 1000.0);
  65.         //确定观察体
  66.         glMatrixMode(GL_MODELVIEW);

  67.         glutDisplayFunc(Painting);//将图形描述送到显示窗口进行显示

  68.         glutMainLoop();//显示图形并等待
  69. }
复制代码

[ 本帖最后由 tan_dunming 于 2009-7-7 04:56 PM 编辑 ]
追求卓越

手机版|VR开发网 统计 津ICP备18009691号
网安备12019202000257

GMT+8, 2021-1-28 10:42 AM

返回顶部