标签: point-sprites

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

我试图在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 …
Run Code Online (Sandbox Code Playgroud)

opengl point-sprites

10
推荐指数
1
解决办法
6949
查看次数

根据与相机的距离调整点精灵的大小

我正在使用仅用于大学的核心OpenGL 3.3编写Wolfenstein 3D的克隆,我遇到了精灵的一些问题,即让它们根据距离正确缩放.

据我所知,以前版本的OGL实际上会为你做这件事,但是这个功能已被删除,而我所有重新实现它的尝试都导致完全失败.

我目前的实施方式是可以在距离上通过,在中距离时不是太破旧,而在近距离时也是如此.

主要问题(我认为)是我对我正在使用的数学没有理解.
精灵的目标大小略大于视口,因此当你接近它时它应该"走出画面",但事实并非如此.它变小了,这让我很困惑.
我录制了一个小视频,以防单词不够.(我在右边)

预期结果 实际结果

谁能指引我到我错的地方,并解释原因?

代码:
C++

// setup
glPointParameteri(GL_POINT_SPRITE_COORD_ORIGIN, GL_LOWER_LEFT);
glEnable(GL_PROGRAM_POINT_SIZE);

// Drawing
glUseProgram(StaticsProg);
glBindVertexArray(statixVAO);
glUniformMatrix4fv(uStatixMVP, 1, GL_FALSE, glm::value_ptr(MVP));
glDrawArrays(GL_POINTS, 0, iNumSprites);
Run Code Online (Sandbox Code Playgroud)

顶点着色器

#version 330 core

layout(location = 0) in vec2 pos;
layout(location = 1) in int spriteNum_;

flat out int spriteNum;

uniform mat4 MVP;

const float constAtten  = 0.9;
const float linearAtten = 0.6;
const float quadAtten   = 0.001;

void main() {
    spriteNum = spriteNum_;
    gl_Position = MVP * vec4(pos.x + 1, pos.y, 0.5, …
Run Code Online (Sandbox Code Playgroud)

c++ opengl glsl point-sprites opengl-3

7
推荐指数
2
解决办法
7677
查看次数

使用现代OpenGL点精灵大小衰减

我正在尝试使用点精灵渲染一些使用OpenGL 3+的粒子.我刚刚意识到我的问题存在重大问题.它们相对于相机距离自动增大.导致以下结果:

靠近粒子发射器:

colse

而在遥远的地方,一切看起来都模糊不清:

远

在旧版本中,似乎可以调整点大小比例glPointParameter.该功能仍可在新的3+ OpenGL中使用,但它仅支持两个参数.GL_POINT_FADE_THRESHOLD_SIZE看起来像我需要的,但我已经尝试过没有结果.我也在用glEnable(GL_PROGRAM_POINT_SIZE);

任何其他方式我可以避免根据相机距离自动缩放点?我宁愿不必更改为使用由三角形组成的标准广告牌的代码.

不知道目前是否相关,但这是我正在使用的顶点着色器:

layout(location = 0) in vec4 a_position_size; // Point size in w coord
layout(location = 1) in vec4 a_color;         // RGBA color modulated with texture

layout(location = 0) out vec4 v_color;

uniform mat4 u_MVPMatrix;

void main()
{
    gl_Position  = u_MVPMatrix * vec4(a_position_size.xyz, 1.0);
    gl_PointSize = a_position_size.w;
    v_color      = a_color;
}
Run Code Online (Sandbox Code Playgroud)

opengl glsl point-sprites particle-system

5
推荐指数
2
解决办法
4019
查看次数

用于粒子系统的GLSL PointSprite

我正在使用带有PointSprites的ParticleSystem(受Cocos2D Source的启发).但我想知道如何重建OpenGL ES 2.0的功能

glEnable(GL_POINT_SPRITE_OES);
glEnableClientState(GL_POINT_SIZE_ARRAY_OES);
glPointSizePointerOES(GL_FLOAT,sizeof(PointSprite),(GLvoid*) (sizeof(GL_FLOAT)*2));
glDisableClientState(GL_POINT_SIZE_ARRAY_OES);
glDisable(GL_POINT_SPRITE_OES);
Run Code Online (Sandbox Code Playgroud)

这些在使用OpenGL ES 2.0上下文时生成BAD_ACCESS.我应该每个PointSprite只使用2个TRIANGLES吗?但那可能不是很有效(额外顶点的开销).

编辑:所以,我的建议解决方案的新问题来自:https: //gamedev.stackexchange.com/questions/11095/opengl-es-2-0-point-sprites-size/15528#15528

可以在批量调用中传递许多不同的大小.我想过使用Attribute而不是Uniform,但是我需要总是将PointSize传递给我的着色器 - 即使我没有绘制GL_POINTS.那么,也许是第二个着色器(仅用于GL_POINTS的着色器)?!我不知道在绘制例程中每一帧切换着色器的开销(因为如果使用粒子系统,我自然也想渲染没有pointSize的常规GL_TRIANGLES)......有什么想法吗?

opengl-es glsl point-sprites particle-system

5
推荐指数
1
解决办法
2312
查看次数

具有不同旋转的OpenGL ES 2.0点精灵 - 在着色器中计算矩阵?

我试图找到一个解决方案,允许我使用不同的属性旋转关于z轴的点精灵(即统一不会这样做).

在我的应用程序中,我每帧绘制了数百/数千个点精灵,然后存储在VBO中(最终可能最终大于1,000,000).因此,我正在寻找内存使用和性能之间的最佳折衷.

顶点和片段着色器的当前外观如下所示:

// VERTEX SHADER
attribute vec4 a_position;
attribute vec4 a_color;
attribute float a_size;
uniform mat4 u_mvpMatrix;
varying vec4 v_color;

void main()
{
    v_color = a_color;
    gl_Position = u_mvpMatrix * a_position;
    gl_PointSize = a_size;
}


// FRAGMENT SHADER
precision mediump float;
uniform sampler2D s_texture;
varying vec4 v_color;

void main()
{
    vec4 textureColor = texture2D(s_texture, gl_PointCoord);
    gl_FragColor = v_color * textureColor;
}
Run Code Online (Sandbox Code Playgroud)

我现在可以想象以下可能性:

  • mat4 rotMatrix向我的点精灵数据添加属性.将此传递给片段着色器并旋转每个片段:

    vec2 texCoord = (rotMatrix * vec4(gl_PointCoord, 0, 1)).xy
    gl_FragColor = v_color * texture2D(s_texture, texCoord); …
    Run Code Online (Sandbox Code Playgroud)

shader matrix point-sprites ios opengl-es-2.0

5
推荐指数
1
解决办法
3101
查看次数

OpenGL 4.3中的纹理点精灵

有没有办法在OpenGl 4.3中将纹理应用于点精灵?我在互联网上搜索过,但大多数教程和指南都使用了仍然支持的旧版本:

 glTexEnvi(GL_POINT_SPRITE, GL_COORD_REPLACE, GL_FALSE);
Run Code Online (Sandbox Code Playgroud)

但是,似乎不再支持此功能,并且标准纹理环境似乎不起作用.关于如何做到或在何处找到如何做的任何建议?

opengl texture-mapping point-sprites

3
推荐指数
1
解决办法
1765
查看次数

在Android上使用OpenGL ES 2.0的Sprite Opacity

我正试图让我的点精灵以正确的不透明度显示.

最初,我在黑色方块上得到了我的精灵纹理.

所以,我在片段着色器中添加了以下内容:

"if(color.a < 0.5) "+
               "discard;"+
Run Code Online (Sandbox Code Playgroud)

现在,这似乎有效,因为我的精灵显示没有黑色背景,但是,我的纹理本身是"部分透明" - 并且它没有显示这种部分透明度,它看起来很稳固.这有点难以解释,但我希望你理解我的意思.如果我使用canvas/surfaceview绘制相同的纹理,它会正确显示.

基本上我正在尝试让我的纹理以原始格式显示(即他们在创建它们的软件中进行显示 - 即Gimp/photoshop等).

非常感谢任何帮助 - 谢谢

android opacity alpha-transparency point-sprites opengl-es-2.0

2
推荐指数
1
解决办法
1663
查看次数