问题标签 [point-sprites]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1892 浏览

android - Android 5.1 崩溃 -- glDrawArrays GL_POINTS -- 致命信号 7 (SIGBUS),代码 2

几个月前,在我将我的 Nexus 4 更新到 Android 5.1(现在是 5.1.1 - 两个来自 Google 的库存工厂图像)之后,我的一个游戏在使用带有 GL_POINTS 的 glDrawArrays 绘制粒子时开始崩溃。我已经简化、重新实现了 Java 中的代码,并复制了崩溃。

崩溃始终是致命信号 7 (SIGBUS),代码 2 似乎是 OpenGL 驱动程序代码。

在这个测试中,对我来说,在 for 循环中有 118 个 drawPoint() 调用,一切似乎运行正常,但如果我尝试 119 个 drawPoint() 调用,则会崩溃(下一帧)。对 drawPoint() 的任何调用(超过 119 次)也会崩溃。

此 Java 代码在 Nexus 4 虚拟设备上运行良好。原始的 C 代码在 PC、iOS 和其他 Android 设备上运行没有任何问题。

这似乎可能是 Nexus 4 驱动程序问题。有任何想法吗?

日志猫:

MainActivity.java 的代码:

0 投票
1 回答
441 浏览

c++ - DirectX 9 点精灵不缩放

我让点精灵几乎立即工作,但我只坚持一件事,它们可能被渲染为 2x2 像素精灵,这不是很容易看到,特别是如果有其他运动。现在,我尝试调整所有变量,这可能是最有效的代码:

好的,所以当我更改POINTSCALE_Aand时POINTSCALE_B,并没有什么真正的变化,对于 C 来说也是如此。POINTSIZE也没有什么区别。当我尝试将某些东西分配给POINTSIZE_MAXand_MIN时,无论我分配什么,它总是会停止精灵的渲染。我也尝试将设置POINTSIZE设置POINTSCALEENABLE为false,那里也没有运气。

这看起来好像没有多少人环顾四周找到答案。MSDN上有对该机制的解释,是的,我确实检查了 stackoverflow 并发现了一个类似的问题,但没有答案。另一个消息来源只建议设置 max 和 min 变量,正如我所说,这几乎使我的粒子消失了。

ParticlePoints并且particleSpeeds是 D3DXVector3 数组,我得到了我对它们的期望。我遵循的一本书建议我用 XYZ 和漫反射定义一个自定义顶点,但老实说,我认为没有理由这样做,它只是为一长串声明添加了更多内容。

欢迎任何帮助,在此先感谢。

编辑:当任何比例值高于 0.99999997f 时(至少在 0.99999998f 之间,我看到了效果),显示了进一步的调整,我得到了微小的版本,如果我把它们放在那里或更低,我几乎得到了纹理——虽然它仍然不是那么好,因为它可能很大,而且它几乎无法完成可控的任务。

0 投票
1 回答
223 浏览

opengl - 在立方体贴图中跨摄像机渲染点精灵

我正在渲染一个顶点粒子系统,然后在几何着色器中将其细分为四边形,并纹理化/渲染为点精灵。然后根据它们与相机的距离来缩放它们的大小。我正在尝试将场景的每一帧渲染成立方体贴图。所以基本上我在我的场景中放置了六个摄像机,并将它们指向立方体表面的每个方向并保存图像。

我的点精灵大小不一。当它们靠近一台摄像机的边界时(如果它们足够大),它们会同时出现在两台摄像机中。由于点精灵始终面向相机,这意味着当我将立方体贴图重新包装到 3d 空间时,它们沿接缝不连续。当这些点非常靠近相机时,这一点尤其明显,因为这些点更大,并且进一步延伸到两个相机视图中。我也在做一些阿尔法混合,所以这也可能导致问题。

我认为我不能只剔除靠近相机边缘的点,因为当我将所有内容放回 3d 时,我会认为会有一些奇怪的区域,云层更稀疏。我的另一个想法是模糊每个相机的边缘,但我认为当我回到 3d 空间时,这也会给我一个奇怪的模糊区域。我觉得我可以在 Photoshop 中手动编辑帧,让它们看起来不错,但这会有点痛苦,因为它是 30fps 的动画。

所附图像是立方体贴图的细节。您可以看到精灵没有正确排列的水平接缝,以及图像右侧稍微不太明显的垂直接缝。我确信我的相机设置是正确的,因为我在其他场景中使用了相同的相机设置,而且我的立方体贴图看起来很好。

有人有想法吗?

我在 openFrameworks / openGL fwiw 中这样做。

立方体贴图的细节

0 投票
1 回答
227 浏览

opengl - gl_PointCoord 编译和链接,但在运行时崩溃

我成功地编写了一个带有点精灵的标准基本变换反馈粒子系统。没有闪烁,粒子从一个缓冲区更新到下一个缓冲区,然后渲染,然后输出缓冲区在下一次迭代时成为输入缓冲区。所有 GPU 端的标准变换反馈。精彩的!一个大问题:它只有在我不使用 gl_PointCoord 时才有效。为我的点精灵使用纯色效果很好。但我需要 gl_PointCoord 来做任何有意义的事情。我所有的着色器,无论他们是否使用 gl_PointCoord,编译和链接都很好。但是,在运行时,如果着色器使用 gl_PointCoord(无论 gl_PointCoord 实际上是否在执行路径中),程序就会崩溃。我明确地 glEnable(GL_POINT_SPRITE)。这没有任何影响。省略 gl_PointCoord,设置 glPointSize(100.0f),使用 vec4(1.0,1.0,1.0, 1.)粒子系统渲染得就像大的白色块状正方形(如预期的那样)。但是在成功编译和链接后,以任何方式使用 gl_PointCoord(作为标准纹理查找坐标或程序颜色或其他任何东西)都会在运行时使我的着色器崩溃。我只是不明白为什么。它通过了glShaderSource、glCompileShader、glAttachShader、glLinkProgram。我将我的着色器编译为#version 430 和 440,我什至尝试了 300 es。所有编译,链接,我检查了编译和链接的状态。都好。我正在使用高端的微软 Surface Book Pro,Visual Studio 2015。NVIDIA GeForce GPU。我还确保我所有的驱动程序都是最新的。不幸的是,对于点精灵,我没有来自顶点着色器的广告牌顶点用于插入片段着色器作为纹理坐标。gl_FragCoord 也不起作用(正如我对点精灵的期望)。有谁知道如何解决这个问题或使用另一种技术来处理点精灵的纹理坐标?

glBeginTransformFeedback(GL_POINTS);//如果我的片段着色器使用gl_PointCoord,它在这里很难崩溃。

回复时,请理解我在 GLSL 和 HLSL 中编写着色器、顶点着色器、像素着色器、曲面细分控制、曲面细分评估和几何着色器方面非常有经验。但我并不声称知道一切。我可能忘记了一些简单的事情;我只是不知道那可能是什么。我想这可能是我没有启用的状态。就变换反馈而言,我还通过 glTransformFeedbackVaryings 正确设置了可变属性。C++:

VS 反馈:

PS反馈:

0 投票
2 回答
140 浏览

android - Android OpenGL ES 点精灵纹理图像上下倒置

我在 android 中使用绘制纹理图像glDrawArrays(GL_POINTS, 0, PARTICLE_NUMBER),然后将其渲染到屏幕上。

在某些手机中,图像是上下颠倒的。似乎OpenGL ES中没有命令GL_POINT_SPRITE_COORD_ORIGIN

有没有其他方法可以解决它?

0 投票
2 回答
1081 浏览

android - 点精灵 alpha 混合问题 (Android / OpenGL ES 2.0)

我最近开始研究适用于 Android 的 OpenGL ES,并且正在开发一个绘图应用程序。我已经实现了一些基础知识,例如点精灵、路径平滑和用于双缓冲的 FBO。目前我正在使用 glBlendFunc,更具体地说,当我将两个具有相同颜色/alpha 值的纹理彼此靠近时,alpha 会被添加,因此它在精灵的交点处看起来更暗。这是一个问题,因为如果很多点靠得很近,则不会保留笔画不透明度,因为颜色往往更不透明,而不是保持相同的不透明度。有没有办法使纹理在交叉点上具有相同的颜色,即相交像素具有相同的 alpha 值,但保留其余像素的 alpha 值?

以下是我如何完成应用程序的相关部分:

  • 为了绘制点精灵列表,我使用如下混合:

    /li>
  • 该应用程序使用带有纹理的 FBO,它首先渲染每个笔触,然后将此纹理渲染到主屏幕。混合功能有:

    /li>
  • OpenGL ES 2.0 不支持 alpha 遮罩;

  • 应用程序的任何地方都没有使用 DEPTH_TEST 函数;
  • 点精灵的纹理是具有透明背景的 PNG;
  • 该应用程序支持纹理遮罩,这意味着一种纹理用于形状,一种纹理用于内容;
  • 我的片段着色器如下所示:

    /li>
  • 我的顶点着色器是这样的:

    /li>

我尝试过使用 glBlendFunc 参数,但找不到合适的组合来绘制我想要的东西。我附上了一些图片,展示了我想要实现的目标以及我目前拥有的目标。有什么建议么?

在此处输入图像描述

解决方案

感谢@ Rabbid76,终于设法用几行代码让它正常工作。首先,在绘制到 FBO 之前,我必须配置我的深度测试功能:

然后在我的片段着色器中,我必须确保掩码中所有 alpha < 1 的像素都被丢弃,如下所示:

结果是(闪烁是由于Android模拟器和gif捕获工具造成的):

在此处输入图像描述

0 投票
1 回答
354 浏览

android - 点精灵 Alpha 混合

我正在开发一款适用于 Android 的绘图应用程序,该应用程序允许用户使用手指进行绘图。它是使用 OpenGL ES 2.0 构建的,使用点精灵技术以及用于快速渲染的 FBO。我在将各个点精灵混合在一起时遇到问题,其中透明区域在 FBO 上正确渲染,但是当精灵重叠时,我可以看到透明区域在前一个精灵上渲染。这是它目前的样子:

在此处输入图像描述

这是与这个混合方程:

如果我将绘图颜色更改为白色或黑色,则效果很好:

在此处输入图像描述

我也试过这个混合功能:

结果是:

在此处输入图像描述

这几乎是完美的,但主要颜色应该变暗而不是白色。关于正确的混合功能应该是什么来实现这一点的任何想法?

注意: 我知道混合函数是如何工作的,方法是获取源颜色和目标颜色的一部分,在我的例子中将它们加在一起,这样颜色会变成白色是有意义的。所以我想知道我想要实现的目标是否可以仅通过混合功能来完成,还是我需要其他东西?如有必要,我可以提供来自片段着色器的代码,但对我来说这看起来不像是片段问题。

0 投票
1 回答
592 浏览

javascript - three.js 的点精灵渲染问题