看起来这应该很简单,但是我使用点精灵的部分纹理有很多困难.我已经广泛浏览了各种各样的答案,但这些都没有处理我遇到的具体问题.

到目前为止我学到了什么

> Basics of point sprite drawing
> How to deal with point sprites rendering as solid squares
> How to alter orientation of a point sprite
> How to use multiple textures with a point sprite,越来越近了..
>这个sprite sprite sheet之前已经完成了,但只能在OpenGL ES 2.0(不是1.0)

这是我想要实现的图表

我在哪里

>我有一组工作点精灵都使用相同的单个方形图像.例如:一个16×16的圆形图像很棒.
>我有一个Objective-C方法,它生成一个含有多个图像的精灵图的600×600图像.我已经验证这是通过将整个sprite sheet图像应用于使用GL_TRIANGLES绘制的四元组.
>我已经使用上述方法成功地将精灵图的部分绘制到四边形.我只是不能让它与点精灵一起工作.
>目前,我正在生成纹理坐标,指向我所针对的精灵图片上精灵的中心.例如:使用底部的图像;星:0.166,0.5;云:0.5,0.5;心脏:0.833,0.5.

码:

顶点着色器

uniform mat4 Projection;
uniform mat4 Modelview;
uniform float PointSize;

attribute vec4 Position;
attribute vec2 TextureCoordIn;

varying vec2 TextureCoord;

void main(void)
{
    gl_Position = Projection * Modelview * Position;
    TextureCoord = TextureCoordIn;
    gl_PointSize = PointSize;
}

片段着色器

varying mediump vec2 TextureCoord;
uniform sampler2D Sampler;

void main(void)
{
    // Using my TextureCoord just draws a grey square,so
    // I'm likely generating texture coords that texture2D doesn't like.
    gl_FragColor = texture2D(Sampler,TextureCoord);

    // Using gl_PointCoord just draws my whole sprite map
    // gl_FragColor = texture2D(Sampler,gl_PointCoord);
}

我坚持的是什么

>我不明白如何在片段着色器中使用gl_PointCoord变量. gl_PointCoord最初包含什么?为什么?它在哪里获取其数据?
>我不明白要传递什么纹理坐标.例如,点精灵如何根据纹理坐标选择我的sprite sheet的哪一部分?我习惯于绘制有效的4组纹理坐标(每个顶点一个)的四边形,这有什么不同(显然是)?

解决方法

我的一位同事答复了.事实证明,诀窍是利用点的大小(在OpenGL单元中)和精灵​​的大小(以纹理单位,(0..1))结合一点向量数学,仅渲染一部分精灵片到每个点.

顶点着色器

uniform mat4 Projection;
uniform mat4 Modelview;
// The radius of the point in OpenGL units,eg: "20.0"
uniform float PointSize;
// The size of the sprite being rendered. My sprites are square
// so I'm just passing in a float.  For non-square sprites pass in
// the width and height as a vec2.
uniform float TextureCoordPointSize;

attribute vec4 Position;
attribute vec4 ObjectCenter;
// The top left corner of a given sprite in the sprite-sheet
attribute vec2 TextureCoordIn;

varying vec2 TextureCoord;
varying vec2 TextureSize;

void main(void)
{
    gl_Position = Projection * Modelview * Position;
    TextureCoord = TextureCoordIn;
    TextureSize = vec2(TextureCoordPointSize,TextureCoordPointSize);

    // This is optional,it is a quick and dirty way to make the points stay the same
    // size on the screen regardless of distance.
    gl_PointSize = PointSize / Position.w;
}

片段着色器

varying mediump vec2 TextureCoord;
varying mediump vec2 TextureSize;
uniform sampler2D Sampler;

void main(void)
{
    // This is where the magic happens.  Combine all three factors to render
    // just a portion of the sprite-sheet for this point
    mediump vec2 realTexCoord = TextureCoord + (gl_PointCoord * TextureSize);
    mediump vec4 fragColor = texture2D(Sampler,realTexCoord);

    // Optional,emulate GL_ALPHA_TEST to use transparent images with
    // point sprites without worrying about z-order.
    // see: https://stackoverflow.com/a/5985195/806988
    if(fragColor.a == 0.0){
        discard;
    }

    gl_FragColor = fragColor;
}

将部分纹理(精灵图/纹理贴图)应用于iOS OpenGL ES 2.0中的点精灵的更多相关文章

  1. ios – 将CIFilter应用于OpenGL渲染到纹理

    我试图在我的全屏渲染输出上应用CoreImage过滤器,但是看起来像我缺少一些东西,因为我将黑屏作为输出.首先我将整个场景画成纹理.然后我从这个纹理创建CoreImage,我终于画出来了.但我所得到的只是黑屏.我正在遵循苹果指南线绘制纹理,并将CoreImage与OpenGLES集成:WWDC2012511和https://developer.apple.com/library/ios/docum

  2. 将部分纹理(精灵图/纹理贴图)应用于iOS OpenGL ES 2.0中的点精灵

    它在哪里获取其数据?>我不明白要传递什么纹理坐标.例如,点精灵如何根据纹理坐标选择我的spritesheet的哪一部分?我习惯于绘制有效的4组纹理坐标的四边形,这有什么不同(显然是)?解决方法我的一位同事答复了.事实证明,诀窍是利用点的大小和精灵的大小结合一点向量数学,仅渲染一部分精灵片到每个点.顶点着色器片段着色器

  3. ios – OpenGL – 为什么GL_ELEMENT_ARRAY_BUFFER的索引?

    我目前是OpenGLES2.0领域的新手,希望尽可能地了解绑定,缓冲区,着色器等.截至目前,我只是想了解GL_ELEMENT_ARRAY_BUFFER和GL_ARRAY_BUFFER之间的差异,以及何时使用每个注释的预设.我目前的理解使我相信GL_ELEMENT_ARRAY_BUFFER是专门用于所述三角形的索引,而另一个则是其他的.有人可以详细说明为什么,如果这是正确的?GL_ELEMENT_A

  4. 在iOS上将CIImage渲染为OpenGL ES 2.0纹理

    有人知道如何通过drawImage将CIImage直接渲染到OpenGLES2.0纹理中:inRect:fromrect:来自iOS上的EAGLCIContext吗?通过createCGImage:fromrect通过普通的CIContext渲染:然后通过GLKTextureLoader加载图像对我来说太慢了.解决方法有一个Wwdc会话,涵盖了这一点.2012年会议511.基本上你想要做的是:–创建输出纹理–使输出纹理成为帧缓冲区的目标–将纹理帧缓冲区绑定为输出而不是屏幕–现在使用drawImage:in

  5. android – OpenGL ES 2.0中的glBlitFrameBuffer()的替代方法

    我的Android程序必须使用glBlitFrameBuffer()函数来复制FrameBuffer对象.但是,仅在OpenGLES3.0设备上支持glBlitFrameBuffer()函数.我想支持OpenGLES2.0设备.有没有解决方案/替代这个功能?解决方法>在源帧缓冲区上绑定用作collor附件的纹理>绑定目标帧缓冲区>绘制全屏四边形>在Frament着色器中从绑定纹理获取数据,并将其放入gl_FragColor

  6. Android NDK OpenGL ES 2.0纹理间距

    有没有办法在opengles2.0中用一个不同于它的宽度的音调来画一个纹理.通常我会通过使用PBO或通过glPixelStore调整GL_PACK_ROW_LENGTH来解决这个问题.但是,Android平台上不存在用于绑定缓冲区的GL_PIXEL_UNPACK_BUFFER或GL_PACK_ROW_LENGTH.glTex(Sub)Image2D不支持此功能.任何提示?解决方法报价@Halsaf

  7. android – 如何在OpenGL ES 1.1上填充不同纹理的立方体的每一面?

    请,我需要教程/代码示例,如何在OpenGLES1.1上填充不同纹理的多维数据集的每一面我发现很多教程,但是没有一个解释清楚如何在每个面上放置不同的纹理,没有一个给出了如何做的简单的代码示例.我的实际代码(来自nehe的例子)在每个面上绘制一个具有相同纹理的立方体:解决方法要使每个面都有不同的纹理,您需要单独渲染立方体的每个面.这意味着每个脸部需要设置纹理,然后渲染脸部(使用glDrawArray

  8. c – OpenGL纹理形式SDLSurface太暗了

    我的问题与这个OpenGlgoestoodark完全相同,但答案对我不起作用.我试图通过转换为纹理的表面来显示图像,结果太黑了:原版的:在openGL之后左边是原版,右边是OpenGlimg.这是我的代码:解决方法您可能在代码中的其他位置设置了一些状态,当您希望禁用它来绘制此四边形时,该状态仍然处于启用状态.尝试在glBindTexture(GL_TEXTURE_2D,_texture)之后添加以

  9. java – 在Android OpenGL ES App中加载纹理

    我想知道是否有人可以建议在AndroidJava和Android中加载纹理的良好模式.OpenGLES应用程序.我首先关心的是确定要分配多少纹理名称以及如何在渲染顶点之前有效地执行此操作.我的第二个问题是加载纹理,我必须根据我的游戏数据推断要加载的纹理.这意味着我将使用字符串,我理解这是我在GL线程中不应该做的事情.总的来说,我了解加载纹理时发生了什么,我只是希望从中获得最佳生命周期.还有其他我应该考虑的事情吗?

  10. c – 哪些用于OpenGL客户端等待:glGetSynciv与glClientWaitSync?

    我从Syncobjects的OpenGL规范不清楚,是否使用glGetSynciv或glClientWaitSync,以防我在不等待的情况下检查同步对象的信令.以下两个命令如何在行为和性能方面进行比较:VS一些细节问题:>glGetSynciv是否执行GL服务器的往返?>任何一种方法死锁或不能立即返回?

随机推荐

  1. iOS实现拖拽View跟随手指浮动效果

    这篇文章主要为大家详细介绍了iOS实现拖拽View跟随手指浮动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  2. iOS – genstrings:无法连接到输出目录en.lproj

    使用我桌面上的项目文件夹,我启动终端输入:cd然后将我的项目文件夹拖到终端,它给了我路径.然后我将这行代码粘贴到终端中找.-name*.m|xargsgenstrings-oen.lproj我在终端中收到此错误消息:genstrings:无法连接到输出目录en.lproj它多次打印这行,然后说我的项目是一个目录的路径?没有.strings文件.对我做错了什么的想法?

  3. iOS 7 UIButtonBarItem图像没有色调

    如何确保按钮图标采用全局色调?解决方法只是想将其转换为根注释,以便为“回答”复选标记提供更好的上下文,并提供更好的格式.我能想出这个!

  4. ios – 在自定义相机层的AVFoundation中自动对焦和自动曝光

    为AVFoundation定制图层相机创建精确的自动对焦和曝光的最佳方法是什么?

  5. ios – Xcode找不到Alamofire,错误:没有这样的模块’Alamofire’

    我正在尝试按照github(https://github.com/Alamofire/Alamofire#cocoapods)指令将Alamofire包含在我的Swift项目中.我创建了一个新项目,导航到项目目录并运行此命令sudogeminstallcocoapods.然后我面临以下错误:搜索后我设法通过运行此命令安装cocoapodssudogeminstall-n/usr/local/bin

  6. ios – 在没有iPhone6s或更新的情况下测试ARKit

    我在决定下载Xcode9之前.我想玩新的框架–ARKit.我知道要用ARKit运行app我需要一个带有A9芯片或更新版本的设备.不幸的是我有一个较旧的.我的问题是已经下载了新Xcode的人.在我的情况下有可能运行ARKit应用程序吗?那个或其他任何模拟器?任何想法或我将不得不购买新设备?解决方法任何iOS11设备都可以使用ARKit,但是具有高质量AR体验的全球跟踪功能需要使用A9或更高版本处理器的设备.使用iOS11测试版更新您的设备是必要的.

  7. 将iOS应用移植到Android

    我们制作了一个具有2000个目标c类的退出大型iOS应用程序.我想知道有一个最佳实践指南将其移植到Android?此外,由于我们的应用程序大量使用UINavigation和UIView控制器,我想知道在Android上有类似的模型和实现.谢谢到目前为止,guenter解决方法老实说,我认为你正在计划的只是制作难以维护的糟糕代码.我意识到这听起来像很多工作,但从长远来看它会更容易,我只是将应用程序的概念“移植”到android并从头开始编写.

  8. ios – 在Swift中覆盖Objective C类方法

    我是Swift的初学者,我正在尝试在Swift项目中使用JSONModel.我想从JSONModel覆盖方法keyMapper,但我没有找到如何覆盖模型类中的Objective-C类方法.该方法的签名是:我怎样才能做到这一点?解决方法您可以像覆盖实例方法一样执行此操作,但使用class关键字除外:

  9. ios – 在WKWebView中获取链接URL

    我想在WKWebView中获取tapped链接的url.链接采用自定义格式,可触发应用中的某些操作.例如HTTP://我的网站/帮助#深层链接对讲.我这样使用KVO:这在第一次点击链接时效果很好.但是,如果我连续两次点击相同的链接,它将不报告链接点击.是否有解决方法来解决这个问题,以便我可以检测每个点击并获取链接?任何关于这个的指针都会很棒!解决方法像这样更改addobserver在observeValue函数中,您可以获得两个值

  10. ios – 在Swift的UIView中找到UILabel

    我正在尝试在我的UIViewControllers的超级视图中找到我的UILabels.这是我的代码:这是在Objective-C中推荐的方式,但是在Swift中我只得到UIViews和CALayer.我肯定在提供给这个方法的视图中有UILabel.我错过了什么?我的UIViewController中的调用:解决方法使用函数式编程概念可以更轻松地实现这一目标.

返回
顶部