我试图在OpenGL中设置点精灵来改变大小,就像广告牌上的精灵一样,但我无法在GL_POINT_DISTANCE_ATTENUATION_ARB
中获得有用的值。是否存在与给定投影匹配的值的相关性?我想要做的事情有可能实现吗?
正在使用的呈现代码:
glPointParameterfARB = (PFNGLPOINTPARAMETERFARBPROC)wglGetProcAddress("glPointParameterfARB");
glPointParameterfvARB = (PFNGLPOINTPARAMETERFVARBPROC)wglGetProcAddress("glPointParameterfvARB");
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluPerspective(100.0, 800.0/600.0, 0.1, 10.0);
float quadratic[] = { 5.0f, 0.1f, 10.0f };
glPointParameterfvARB( GL_POINT_DISTANCE_ATTENUATION_ARB, quadratic );
float maxSize = 0.0f;
glGetFloatv( GL_POINT_SIZE_MAX_ARB, &maxSize );
if( maxSize > 100.0f ) maxSize = 100.0f;
glPointSize( maxSize );
glPointParameterfARB( GL_POINT_FADE_THRESHOLD_SIZE_ARB, 0.1f );
glPointParameterfARB( GL_POINT_SIZE_MIN_ARB, 0.1f );
glPointParameterfARB( GL_POINT_SIZE_MAX_ARB, maxSize );
glTexEnvf( GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE );
glEnable( GL_POINT_SPRITE_ARB );
glScalef(0.75,1,1);
glTranslatef(0.00,0.0,-1.0);
glScalef(0.5,0.5,0.5);
glRotatef(counter*0.1+0.5,1.0,1.0,0.0);
glBegin( GL_POINTS );
for( int i = 0; i < 100; ++i )
{
glColor4f( i%10*0.1, i/10*0.1, 0.5, 1.0f );
glVertex3f( i%10*0.2-1.0,i/10*0.2-1.0,
((i%10-5)*(i%10-5)+(i/10-5)*(i/10-5))*0.01 );
}
glEnd();
glDisable( GL_POINT_SPRITE_ARB );
发布于 2009-06-24 15:24:09
这是我如何让我的可怜的男人的方法来缩放点大小:
void render() {
glEnable(GL_VERTEX_PROGRAM_POINT_SIZE_ARB);
glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);
glEnable(GL_POINT_SPRITE);
glActiveTexture(GL_TEXTURE0);
glTexEnvi(GL_POINT_SPRITE, GL_COORD_REPLACE, GL_TRUE);
/* Activate shader program here */
/* Send pointSize to shader program */
glBegin(GL_POINTS);
/* Render points here */
glVertex3f(...);
glEnd(GL_POINTS);
}
顶点着色器:
uniform float pointSize;
void main() {
gl_Position = ftransform();
gl_PointSize = pointSize / gl_Position.w;
}
你可以在碎片着色器中做任何你想做的事情,但你必须自己计算颜色,照明和纹理。
发布于 2011-03-31 15:10:34
抛开GLSL不谈,使用距离衰减做你想做的事情是相当简单的。在透视投影中,物体的投影尺寸是如何随着距离二次减少的,你只需要使用二次因子。
如果您希望在距眼睛150个单位的距离处使用手动设置的点大小,只需使用1/(150^2)作为二次因子(对于常数和线性因子使用0 --如果有的话,您可能希望对常数因子使用一些较小的数字,如0.01,以避免潜在的除以零)。
发布于 2009-05-26 11:06:08
根据我的经验,点大小衰减不值得这么麻烦。您最好编写一个非常简单的GLSL顶点着色器,该着色器根据您自己执行的一些计算手动设置点大小。我花了大约半天的时间从头开始学习所有我需要的GLSL来实现这个目标。
GLSL代码可能与以下几行代码一样简单:
attribute float psize;
void main()
{
gl_FrontColor = gl_Color;
gl_PointSize = psize;
gl_Position = ftransform();
}
其中psize
是用户选择的点大小参数。
https://stackoverflow.com/questions/907756
复制相似问题