首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否可以使用OpenGL点精灵来模拟广告牌精灵?

是否可以使用OpenGL点精灵来模拟广告牌精灵?
EN

Stack Overflow用户
提问于 2009-05-25 19:10:12
回答 4查看 7.2K关注 0票数 10

我试图在OpenGL中设置点精灵来改变大小,就像广告牌上的精灵一样,但我无法在GL_POINT_DISTANCE_ATTENUATION_ARB中获得有用的值。是否存在与给定投影匹配的值的相关性?我想要做的事情有可能实现吗?

正在使用的呈现代码:

代码语言:javascript
运行
复制
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 );
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-06-24 15:24:09

这是我如何让我的可怜的男人的方法来缩放点大小:

代码语言:javascript
运行
复制
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);
}

顶点着色器:

代码语言:javascript
运行
复制
uniform float pointSize;
void main() {
    gl_Position = ftransform();
    gl_PointSize = pointSize / gl_Position.w;
}

你可以在碎片着色器中做任何你想做的事情,但你必须自己计算颜色,照明和纹理。

票数 6
EN

Stack Overflow用户

发布于 2011-03-31 15:10:34

抛开GLSL不谈,使用距离衰减做你想做的事情是相当简单的。在透视投影中,物体的投影尺寸是如何随着距离二次减少的,你只需要使用二次因子。

如果您希望在距眼睛150个单位的距离处使用手动设置的点大小,只需使用1/(150^2)作为二次因子(对于常数和线性因子使用0 --如果有的话,您可能希望对常数因子使用一些较小的数字,如0.01,以避免潜在的除以零)。

票数 2
EN

Stack Overflow用户

发布于 2009-05-26 11:06:08

根据我的经验,点大小衰减不值得这么麻烦。您最好编写一个非常简单的GLSL顶点着色器,该着色器根据您自己执行的一些计算手动设置点大小。我花了大约半天的时间从头开始学习所有我需要的GLSL来实现这个目标。

GLSL代码可能与以下几行代码一样简单:

代码语言:javascript
运行
复制
attribute float psize;

void main()
{   
    gl_FrontColor = gl_Color;
    gl_PointSize = psize;
    gl_Position = ftransform();
}

其中psize是用户选择的点大小参数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/907756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档