我要发帖 回复

中级会员

27

主题

124

积分

0

专家分

:

私信
发表时间 : 2009-6-8 12:31:38 | 浏览 : 2639    评论 : 5
下面是我做的一个实验,采用了反走样后还是存在锯齿,不知道是什么原因,是不是有地方做的不对.
    还有一个问题是,按下前后左右的方向键控制车的进退与左右转向.当程序开始运行,改变了车的方向后,车在前进过程中就开始抖动.如果在开始的时候不按左右键,只按前后键,那么车在前进的过程中就不会出现抖动.这个是什么原因,会不会与没处理好反走样有关.
    其次,当采用void CMyOPGLView::Draw3ds()中的//glTranslatef(0.8*sin(have_turnradian)+Pos[0],-0.06,-0.8*cos(have_turnradian)+Pos[2]);这条语句的时候,视点在车的后面,这个时候可以看到整个车,会看到车的表面有一个个明显的三角形,怎样才能将三角形变得不那么明显?
    设置反走样的代码在void CTriObject::drawGL()中.
    程序的代码在18.rar中,汽车模型在carmodel.rar中,天空盒子的纹理分开放在下面两个文件中skytex_1.rar与skytex_2.rar.把模型与天空的纹理直接放在程序的工程目录下就可以运行了.
    不胜感激!!!

18.rar

481.55 KB, 下载次数: 22

程序的代码

carmodel.rar

285.82 KB, 下载次数: 18

汽车模型

skytex_1.rar

417.83 KB, 下载次数: 24

一部分天空的纹理

skytex_2.rar

299.36 KB, 下载次数: 20

另一部分天空的纹理

最近VR访客

tan_dunming 评论于2009-6-8 15:30:40
效果是不太好 查阅了红宝书以及超级宝典 关于反走样都是这么用的 所以抱歉

另外补充一个错误
http://www.52vr.com/bbs/viewthread.php?tid=10702&extra=page%3D1
这个帖子中 第一种方法还需要如下一句 glLineWidth(3.5);//具体的数值只要大于1即可

考虑反走样效果一般的原因 很有可能是因为硬件的缘故 因为glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST);只是给硬件一个提示Hint,硬件只能尽力而为,但是如果做不到的话就不是必须要做了。如果是好一点的显卡也许就会有效果吧。

我找到《OpenGL超级宝典》中一个反走样的例子Smoother.cpp,也是这么用的,其中点和线的反走样效果还可以,但是多边形的就不行。也许是显卡无能为力吧???我的是ATI X800的显卡 有点年头了

未开启反走样的效果
0.jpg
开启反走样的效果(注意比较前后两副图 点和线的差别明显 而右上角的多边形效果无大的差异)
1.jpg

另外附上代码供你研究
  1. // Smoother.cpp
  2. // OpenGL SuperBible
  3. // Demonstrates point, line, and polygon smoothing
  4. // Program by Richard S. Wright Jr.
  5. #include "../../shared/gltools.h"       // OpenGL Tools library
  6. #include "../../shared/math3d.h"
  7. #include


  8. // Array of small stars
  9. #define SMALL_STARS 100
  10. M3DVector2f  vSmallStars[SMALL_STARS];

  11. #define MEDIUM_STARS   40
  12. M3DVector2f vMediumStars[MEDIUM_STARS];

  13. #define LARGE_STARS 15
  14. M3DVector2f vLargeStars[LARGE_STARS];

  15. #define SCREEN_X    800
  16. #define SCREEN_Y    600

  17. ///////////////////////////////////////////////////////////////////////
  18. // Reset flags as appropriate in response to menu selections
  19. void ProcessMenu(int value)
  20.     {
  21.     switch(value)
  22.         {
  23.         case 1:
  24.             // Turn on antialiasing, and give hint to do the best
  25.             // job possible.
  26.             glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  27.             glEnable(GL_BLEND);
  28.             glEnable(GL_POINT_SMOOTH);
  29.             glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);
  30.             glEnable(GL_LINE_SMOOTH);
  31.             glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
  32.             glEnable(GL_POLYGON_SMOOTH);
  33.             glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST);
  34.             break;

  35.         case 2:
  36.             // Turn off blending and all smoothing
  37.             glDisable(GL_BLEND);
  38.             glDisable(GL_LINE_SMOOTH);
  39.             glDisable(GL_POINT_SMOOTH);
  40.             glDisable(GL_POLYGON_SMOOTH);
  41.             break;

  42.         default:
  43.             break;
  44.         }
  45.         
  46.     // Trigger a redraw
  47.     glutPostRedisplay();
  48.     }


  49. ///////////////////////////////////////////////////
  50. // Called to draw scene
  51. void RenderScene(void)
  52.     {
  53.     int i;                  // Loop variable
  54.     GLfloat x = 700.0f;     // Location and radius of moon
  55.     GLfloat y = 500.0f;
  56.     GLfloat r = 50.0f;
  57.     GLfloat angle = 0.0f;   // Another looping variable
  58.                         
  59.     // Clear the window
  60.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  61.          
  62.     // Everything is white
  63.     glColor3f(1.0f, 1.0f, 1.0f);
  64.    
  65.     // Draw small stars
  66.     glPointSize(1.0f);
  67.     glBegin(GL_POINTS);
  68.         for(i = 0; i < SMALL_STARS; i++)
  69.             glVertex2fv(vSmallStars[i]);
  70.     glEnd();
  71.         
  72.     // Draw medium sized stars
  73.     glPointSize(3.05f);
  74.     glBegin(GL_POINTS);
  75.         for(i = 0; i< MEDIUM_STARS; i++)
  76.             glVertex2fv(vMediumStars[i]);
  77.     glEnd();
  78.         
  79.     // Draw largest stars
  80.     glPointSize(5.5f);
  81.     glBegin(GL_POINTS);
  82.         for(i = 0; i < LARGE_STARS; i++)
  83.             glVertex2fv(vLargeStars[i]);
  84.     glEnd();
  85.         
  86.     // Draw the "moon"
  87.     glBegin(GL_TRIANGLE_FAN);
  88.         glVertex2f(x, y);
  89.         for(angle = 0; angle < 2.0f * 3.141592f; angle += 1.0f)
  90.             glVertex2f(x + (float)cos(angle) * r, y + (float)sin(angle) * r);
  91.             glVertex2f(x + r, y);
  92.     glEnd();

  93.     // Draw distant horizon
  94.     glLineWidth(3.5);
  95.     glBegin(GL_LINE_STRIP);
  96.         glVertex2f(0.0f, 25.0f);
  97.         glVertex2f(50.0f, 100.0f);
  98.         glVertex2f(100.0f, 25.0f);
  99.         glVertex2f(225.0f, 125.0f);
  100.         glVertex2f(300.0f, 50.0f);
  101.         glVertex2f(375.0f, 100.0f);
  102.         glVertex2f(460.0f, 25.0f);
  103.         glVertex2f(525.0f, 100.0f);
  104.         glVertex2f(600.0f, 20.0f);
  105.         glVertex2f(675.0f, 70.0f);
  106.         glVertex2f(750.0f, 25.0f);
  107.         glVertex2f(800.0f, 90.0f);   
  108.     glEnd();


  109.     // Swap buffers
  110.     glutSwapBuffers();
  111.     }


  112. // This function does any needed initialization on the rendering
  113. // context.
  114. void SetupRC()
  115.     {
  116.     int i;
  117.         
  118.     // Populate star list
  119.     for(i = 0; i < SMALL_STARS; i++)
  120.         {
  121.         vSmallStars[i][0] = (GLfloat)(rand() % SCREEN_X);
  122.         vSmallStars[i][1] = (GLfloat)(rand() % (SCREEN_Y - 100))+100.0f;
  123.         }
  124.             
  125.     // Populate star list
  126.     for(i = 0; i < MEDIUM_STARS; i++)
  127.         {
  128.         vMediumStars[i][0] = (GLfloat)(rand() % SCREEN_X * 10)/10.0f;
  129.         vMediumStars[i][1] = (GLfloat)(rand() % (SCREEN_Y - 100))+100.0f;
  130.         }

  131.     // Populate star list
  132.     for(i = 0; i < LARGE_STARS; i++)
  133.         {
  134.         vLargeStars[i][0] = (GLfloat)(rand() % SCREEN_X*10)/10.0f;
  135.         vLargeStars[i][1] = (GLfloat)(rand() % (SCREEN_Y - 100)*10.0f)/ 10.0f +100.0f;
  136.         }
  137.             
  138.             
  139.     // Black background
  140.     glClearColor(0.0f, 0.0f, 0.0f, 1.0f );

  141.     // Set drawing color to white
  142.     glColor3f(0.0f, 0.0f, 0.0f);
  143.     }



  144. void ChangeSize(int w, int h)
  145.     {
  146.     // Prevent a divide by zero
  147.     if(h == 0)
  148.         h = 1;

  149.     // Set Viewport to window dimensions
  150.     glViewport(0, 0, w, h);

  151.     // Reset projection matrix stack
  152.     glMatrixMode(GL_PROJECTION);
  153.     glLoadIdentity();

  154.     // Establish clipping volume (left, right, bottom, top, near, far)
  155.     gluOrtho2D(0.0, SCREEN_X, 0.0, SCREEN_Y);


  156.     // Reset Model view matrix stack
  157.     glMatrixMode(GL_MODELVIEW);
  158.     glLoadIdentity();
  159.     }

  160. int main(int argc, char* argv[])
  161.         {
  162.         glutInit(&argc, argv);
  163.         glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  164.         glutInitWindowSize(800, 600);
  165.         glutCreateWindow("Smoothing Out The Jaggies");
  166.        
  167.         // Create the Menu
  168.         glutCreateMenu(ProcessMenu);
  169.         glutAddMenuEntry("Antialiased Rendering",1);
  170.         glutAddMenuEntry("Normal Rendering",2);
  171.         glutAttachMenu(GLUT_RIGHT_BUTTON);
  172.        
  173.         glutReshapeFunc(ChangeSize);
  174.         glutDisplayFunc(RenderScene);
  175.         SetupRC();
  176.         glutMainLoop();

  177.         return 0;
  178.         }
复制代码
追求卓越
tan_dunming 评论于2009-6-8 15:33:07
如果你确实需要反走样处理的话 我的建议是要么换好点的显卡测试一下效果 要么就参照方法2.使用累计缓冲多次渲染(比较复杂且效率低)
具体的请参考SGI所出的《Advanced Rending》,见论坛的帖子
http://www.52vr.com/bbs/viewthre ... ;highlight=Advanced

见 accumaa.c
追求卓越
yaojianfu 评论于2009-6-8 20:37:33
哦,你能不能帮我看一下,车在行驶过程中震动是什么原因?
谢谢!
tan_dunming 评论于2009-6-9 09:23:11
1 抗锯齿
原因:大多数显卡虽然具有抗锯齿的功能,但默认都是关闭的,因为要消除锯齿需要多次渲染,严重影响3D性能,所以昨天发的帖子中多边形仍然有锯齿。
解决办法:打开显卡属性设置,开启抗锯齿。(以我的ATI X800显卡为例,其他的类似)
2.JPG
之后再次运行程序,已无锯齿,效果如下:
3.JPG
当然,此时刷新率肯定受到了很大影响。

2 抖动
我觉得很有可能是这个地方的问题,总感觉这样处理有问题,车辆旋转不应该是这样处理吧。具体的你慢慢研究下,抱歉,我最最近很忙,只能做这么多了。
void CMyOPGLView::Draw3ds()
这样的绘制方法的问题,特别是
  1. glTranslatef(0.03*sin(have_turnradian)+Pos[0],-0.06,-0.03*cos(have_turnradian)+Pos[2]);  //视点与车保持0.03的距离,have_turnradian是弧度
  2.                         //glTranslatef(0.8*sin(have_turnradian)+Pos[0],-0.06,-0.8*cos(have_turnradian)+Pos[2]);  //视点与车保持0.8的距离
  3.                         glRotatef(-90.0,1.0,0.0,0.0);
  4.                         glRotatef(-have_turnangle,0.0,0.0,1.0);  //have_turnangle是角度
复制代码
追求卓越
yaojianfu 评论于2009-6-10 21:44:42
非常感谢版主的指点,抖动的确是glTranslatef的问题,将里面加号的两部分分别有两个glTranslatef实现,如                        glTranslatef(Pos[0],-0.06,Pos[2]);
        glTranslatef(0.03*sin(have_turnradian),0.0,-0.03*cos(have_turnradian));
      抖动的现象就不再存在,具体原因不知道是什么?

还有一个问题,版主不知道是什么原因?这里不知道怎么上传图片所以重新发了个帖子,地址是http://www.52vr.com/bbs/viewthre ... e%3D1&frombbs=1

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

GMT+8, 2020-10-2 06:02 AM

返回顶部