GL_POINT_SPRITE_ARB(广告牌)旋转时的照明问题

Posted

技术标签:

【中文标题】GL_POINT_SPRITE_ARB(广告牌)旋转时的照明问题【英文标题】:GL_POINT_SPRITE_ARB (billboarding) problems with lighting upon rotation 【发布时间】:2012-02-08 10:33:25 【问题描述】:

我创建了一个小应用程序来显示单个粒子:

当我在场景中旋转时,灯光会发生变化,粒子几乎变得不可见:

是否可以在整个旋转过程中强制设置照明?

相关代码:

// init
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glAccum(GL_RETURN, 0.95f);

glClear(GL_ACCUM_BUFFER_BIT);
glClearAccum(0.0f, 0.0f, 0.0f, 0.0f);


glDisable(GL_CULL_FACE);
glShadeModel(GL_SMOOTH);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClearDepth(1.0f);
glDisable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);



float quadratic[3]  =  0.0, 0.0, 0.01337f ;
float linear[3]  =  0.0, 1, 0.0 ;
float constant[3]  =  0.01, 0.0, 0.0 ;

glPointParameterfvARB(GL_POINT_DISTANCE_ATTENUATION_ARB, quadratic);
float maxSize = 0.0f;
glGetFloatv( GL_POINT_SIZE_MAX_ARB, &maxSize );
glPointSize( maxSize );
glPointParameterfARB( GL_POINT_SIZE_MAX_ARB, maxSize );
glPointParameterfARB( GL_POINT_SIZE_MIN_ARB, 1.0f );

QImage b("particle.bmp");

QImage t;
t = QGLWidget::convertToGLFormat(b);
glGenTextures(1, texture);
glBindTexture(GL_TEXTURE_2D, texture[0]);
glTexImage2D(GL_TEXTURE_2D, 0, 3, t.width(), t.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, t.bits());
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexEnvf(GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE);

以及绘图功能:

// draw function:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glAccum(GL_RETURN, 0.95f);
glClear(GL_ACCUM_BUFFER_BIT);

glDepthMask(GL_FALSE);
glEnable(GL_BLEND);
glEnable(GL_TEXTURE_2D);
glEnable(GL_LIGHTING);
glEnable(GL_POINT_SPRITE_ARB);
glColor4f(1.0f, 1.0f, 0.1f, 0.7f);

glBegin(GL_POINTS);
// Loop over all particles and draw the gl points separately:
        glVertex3f(x, y, z);
glEnd();
glDisable(GL_POINT_SPRITE_ARB);
glDisable(GL_TEXTURE_2D);
glDisable(GL_LIGHTING);
glDisable(GL_BLEND);
glAccum(GL_ACCUM, 0.5f);

如果您想自己测试here's 完整代码。我使用 libqglviewer 进行相机旋转。

【问题讨论】:

Alt+PrintScreen 通常只捕获活动窗口。 我知道。截图对我来说似乎是次要的。我更新了它们。谢谢! 【参考方案1】:

关闭GL_LIGHTING。我不知道你为什么一开始就戴上它。

【讨论】:

哈,是的。确实做到了!我在另一台计算机上创建了这篇文章,却忘记提交这些更改。所以我面前的代码看起来像这样:' glEnable(GL_BLEND); glEnable(GL_TEXTURE_2D); glEnable(GL_POINT_SPRITE_ARB); glColor4f(1.0f, 1.0f, 0.1f, 0.7f); glBegin(GL_POINTS);画(); glEnd(); glDisable(GL_POINT_SPRITE_ARB); glDisable(GL_TEXTURE_2D); glDisable(GL_BLEND); ' 这让我记得,libqglviewer 可能为绘图功能启用 GL_LIGHTING。我只需要首先禁用 GL_LIGHTING。

以上是关于GL_POINT_SPRITE_ARB(广告牌)旋转时的照明问题的主要内容,如果未能解决你的问题,请参考以下文章

旋转回纵向时视口缩放中断

如何将页面旋转为横向,页面内容应为纵向 iTextpdf

自动将肖像倒置旋转为iphone X的肖像?

AVPlayer 将纵向视频旋转为横向

text 旋转圈在progress.pde

为啥我的矩阵旋转会在 OpenGL 中倒退