图片上的 是两个情况的一个示例,其中正在呈现一个纹理多边形.全部由OpenGL ES2. a)多边形部分不在视口上 b)多边形完全在其内部 我的问题: 是情况'a)'将消耗较少的系统/gpu资源*,因为纹理部分是屏幕上方的,或者它的执行方式与我在视口内部呈现的情况一样,为什么? *"资源" - 意思是速度,而不是内存. 我知道OpenGL会首先计算顶点,在呈现纹理之前,如果顶点不在屏幕/视口上,它会跳过任何进一步的计算,但是是否与部分偏离屏幕的纹理对象相同? 它会省略纹理不可见的部分吗? 解决方案 情况应更快.顶点处理将相同.之后,将剪辑到视图卷中.在情况A中,一部分多边形将被剪切,而整个多边形在情况B中进行.此后,多边形被栅格化,所得片段进入片段处理.由于情况A的碎片较少,因此在此阶段要做的工作更少.片段着色器进行纹理采样,因此在这种情况下只能对纹理的可见部分进行采样. 剪辑也可能在生成片段后发生,但是我总是希望它在片段着色之前完成.
以下是关于 textures 的编程技术问答
我的游戏中有大量的2D图像,有多层.我使用spritebatch()和orthographicCamera().我有一些关于表演的基本问题: 使用地图集是加载图像的更快方法吗? 什么更快地使用,PixMap(并在绘制前转换为纹理)或纹理? 当我制作多层映像时,我应该使用Texture.draw(或Pixmap.draw用于pixmap),制作最终图像然后渲染吗?还是我应该在spritebatch.begin()和spritebatch.end()? 中渲染所有内容 是否有一种方法可以跟踪" Dirty Sprites"(屏幕的一部分在两个帧之间更改),并且仅渲染该区域以提高性能? 另外,我如何看待程序资源所占的内存量,以及如何管理它? (也许这个问题有点困难) 感谢您的帮助(欢迎其他一般建议) 解决方案 是的,这减少了渲染时需要交换纹理的次数.这通常比使用单独的图像要快得多. 不确定您的意思是,PixMap仅应用于需要动态更改或作为缓存形式生成的纹理
在我的实时壁纸中,我绘制了覆盖整个屏幕的3个纹理四边形.在Nexus上,我得到40fps.我正在寻找改善性能的方法. 四边形彼此混合在一起,从RGB_8888位图中加载纹理.纹理为1024x1024. 我有 glDisable(GL_DITHER); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST); glDisable(GL10.GL_LIGHTING); glDisable(GL_DEPTH_TEST); glEnable(GL_TEXTURE_2D); glEnable(GL_BLEND); glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 我尝试过的事情,所有这些都导致相同的40fps: 将纹理大小降低到512x512和256x256 使用draw_texture扩展 禁用混合 更改纹理过滤从gl_linear到gl_nearest 使用vbos(绝望的
我想将图像放在3D对象上.为了使事情保持简单快捷,而不是使用(学习)3D库,我想使用映射图像.映射图像以这样的方式使用: 因此,您可以为每个对象生成一次映射图像,并为要包装的所有图像使用相同的映射. 我的问题是如何生成此类映射图像(给定3D模型)?由于我不知道术语,我的搜索使我失望了.对不起,如果我使用错误的行话. 下面您可以看到工作流的描述. 我有对象的3D模型和输入图像,我想生成可以用来生成纹理图像的映射图像. 我什至不知道从哪里开始,任何指针都会受到赞赏. 更多信息 我最初的想法是用外部程序以某种方式包装身份映射(见下文).我在Photoshop中生成了水平和垂直梯度图像,只是为了查看使用Photoshop生成的图像的映射作品.结果看起来不好.我没有希望,但值得一试. 输入 映射(x和y),他们只是调整了图像大小,他们没有做任何花哨的事情. 结果 如您所见,有很多文物.自定义映射图像我通过翘曲梯度生成的图像看起来更糟
例如,假设我有2个精灵节点(但也可能超过2个): 每个人都有自己的单独图像 我想要的是将它们组合并创建一个具有单个图像(在工具模式) 的新精灵节点 这样: 也许可以使用 > ? 解决方案 我找到了一个解决方案, tool extends Sprite export (Vector2) var img_size setget set_img_size export (String) var img_path = "res://MergeImg.png" export (bool) var generate_img = false setget set_generate_img var ep_filesystem=EditorPlugin.new().get_editor_interface().get_resource_filesystem() func set_img_size(new_val): img_size=new_val
在我的程序中,我有一个在不同情况下使用多次使用的纹理.在每种情况下,我都需要应用一组参数. 我想避免必须创建一个其他缓冲区,并且本质上是每当需要将其用于其他东西时创建纹理的副本,所以我想知道是否有更好的方法? 解决方案 这就是 Sampler对象是(自版本3.3以来可用,或使用ARB_sampler_objects ).采样器对象将纹理图像与其参数分开,因此您可以使用一个带有几个参数集的纹理.该功能是在您的问题上创建的. 引用ARB_sampler_objects扩展规格: 在未扩展的OpenGL纹理中被认为是图像数据集(MIP链,阵列,立方体映射面部集合等)和采样状态(采样模式,MIP映射状态,协调包装和夹紧规则,等等.)合并成一个对象.典型的应用程序是使用许多纹理的纹理,它们之间的采样状态相同.为了以这种方式使用纹理,应用程序必须生成和配置许多纹理名称,并将开销添加到应用程序和实现中.此外,如果应用程序希望以多种方式(例如,没有MIP映射)从纹理中进行采样.
我正在使用HTML5 Canvas API绘制Pixel Art游戏的瓷砖地图.渲染图块图由许多较小的图像组成,这些图像是从单个源图像中切出的称为瓷砖板的.我正在使用drawImage(src_img, sx, sy, sw, sh, dx, dy, dw, dh)将单个瓷砖从源图像中切出,并将其绘制到目的地画布上.我正在使用setTransform(sx, 0, 0, sy, tx, ty)将刻度和翻译应用于最终渲染图像. 我需要修复的颜色"出血"问题是由采样器引起的,该采样器使用插值在比例操作过程中混合颜色,以使事物看起来不像像素化.这非常适合扩展数码照片,但不适合像素艺术.尽管这不会对瓷砖中心造成太大的视觉损害,但采样器沿源图像中相邻瓷砖边缘的颜色融合了颜色,从而在渲染的瓷砖图中产生了意外的颜色. Sampler不仅只使用属于源矩形内的颜色传递给drawImage,还以颜色从其边界外的颜色融合,从而导致瓷砖之间似乎是间隙的东西. 下面是我的瓷砖表的源图像.它的实际尺寸为
我想动画2D精灵表.我将一张具有不同框架大小的角色动画的精灵表.对于一个动画,我将一个顶点缩放以适合一个帧,然后更改动画的纹理位置.一个动画非常有效,但是当切换到具有不同框架尺寸和比例顶点并再次拟合纹理的另一个动画时,我会在纹理伸展而不适合的情况下获得副作用,它只是在一个动画框架上,但要进行更改,但是两个动画看起来很糟糕. 我认为,这是因为顶点大小的变化.因此,我的想法是要具有固定的顶点大小并安装纹理而不将其交织到完整的顶点(每个动画的高度都是固定的). 也许图像会有所帮助,所以我创建了一个: 这是我的代码,希望足够: public boolean nextFrame() { float textureWidth = textureMap()[currentAnimation][0]; float frameCount = textureMap()[currentAnimation][1]; float frameWidth = textur
我启动了一个项目,该项目的概念是在整个游戏中连续重复使用相同的纹理2D对象,并定期重新加载新纹理.随着时间的流逝,这证明了我跑到:system.outofmemoryexception 时证明了一个坏主意. bool loadImages(string image) { System.Diagnostics.Debug.WriteLine("beginning loading textures " + image); try { //image_a = null; //image_o = null; //image_o.Dispose(); //image_a.Dispose(); image_o = Content.Load("images/"+image);
如何使用oes_texture_float扩展名? 我不明白有必要指定参数the teximage2d. var fb=gl.createFramebuffer(); gl.bindFramebuffer(gl.FRAMEBUFFER, fb); var rb=gl.createRenderbuffer(); gl.bindRenderbuffer(gl.RENDERBUFFER, rb); gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16,size[0],size[1]); gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT,gl.RENDERBUFFER, rb); var texture=gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D, texture); gl.texParam
我认为图像文件大小不必是2.0中的两个功率 但是当我尝试时,它只是显示了黑屏. 但是,这可以与两个图像的功能一起使用. 谁能给我一些提示,或者我应该使用NPOT图像做什么? 谢谢你 不幸的是, 解决方案 iOS的OpenGL ES需要两个图像,因为这是一个相当严格的实现(例如,请查看OpenGL ES中所有不可用的所有内容). 如果您的图像是非两个功率,则有一些解决方案. 首先,最明显的是,您必须在图像中添加一些填充物才能使其如此.这可以在图像编辑器中或加载纹理数据时进行编程. 第二,如果您有多个纹理,则可以使用纹理包装工具将图像编译成一个较大的图像.根据您的预期用途,这是一种更有针对性的方法,如果您打算将纹理用于多个3D网格或型号,则需要更多的工作,因为您的UV/纹理坐标将与其原件不同. . 编辑 ,由于并非所有人都会阅读评论,因此我会引用我的评论以使其更高的知名度.在非常具体的情况下,NPOT纹理是有效的,如下所示. 进行了一些挖掘后,NP
我有一个GlkView,我尝试绘制几个立方体,然后从视图中创建纹理并将其映射到立方体上.但是,当我在视网膜设备上启动应用程序时,纹理尺寸正确,但看起来很糟糕.我试图将GlkView的ContentsCaleFactor设置为主屏幕的比例 - 无济于事.我还试图将缓冲尺寸乘以刻度,从而导致纹理看起来清晰,但仅是原始大小的1/4 ... 不进一步的ADO,我可能会向您介绍我所做的工作(没有上述乘法): glkview - (void)setupGL { UIScreen *mainScreen = [UIScreen mainScreen]; const CGFloat scale = mainScreen.scale; self.contentScaleFactor = scale; self.layer.contentsScale = scale; glGenFramebuffers(1, &defaultFrameBuffe
我在iPad 2/3上使用OpenGL ES 2.0.创建纹理时我想使用GL_FLOAT: glteximage2d(gl_texture_2d,0,gl_rgba,texwidth,texheight,0,gl_rgba,gl_float,rawdata); > 但是问题在于,如果没有GL_OES_TEXTURE_FLOAT_LILEAR显示在支持的扩展名单中,则不支持GL_LINEAR作为GL_TEXTURE_MAG_FILTER. (iPad都没有.) 但我确实有GL_OES_TEXTURE_HALF_FLOAT_LILEAR在我的扩展名单中.因此,使用半浮纹理应与线性插值一起工作. 问题是,将我的纹理创建切换到: glteximage2d(gl_texture_2d,0,gl_rgba,texwidth,texheight,0,gl_rgba,gl_half_float_oes,rawdata); > 在运行应用程序时会导致exc_bad_acce
我正在使用OpenGL | ES 2.0创建一个简单的2D平方.我正在努力使纹理工作.在这方面请帮助我.我已附上以下代码: gfxutils: public class GFXUtils { public static final String TAG = "GFXUtils"; public static final int COORDS_PER_VERTEX = 3; public static final int COORDS_PER_TEXTURE = 2; public static int vertexStride = COORDS_PER_VERTEX * 4; // bytes per vertex public static int textureStride = COORDS_PER_TEXTURE * 4; // bytes per vertex public static Context Con
我一直在玩OpenGL ES Android,以某种方式我的纹理总是充满左上最左上像素的颜色.我想旗帜是错误的,但是我尝试了许多逻辑组合,但似乎没有任何区别. 为什么纹理会这样?我缺少什么位(确实是旗帜)?谢谢 public void loadGLTexture(GL10 gl, Context context) { Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), resourceId); gl.glGenTextures(1, textures, 0); gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]); gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST); gl.glTexPa
布拉德·拉尔森(Brad Larson)提供了一些很棒的代码在这里a href =" https://stackoverflow.com/questions/12384848/getting-screenshot-via-cvopendextextextextextexterecachecreate/18301382#18301382>清楚这是否与我用于其余图纸的框架缓冲器相同. 如果您将RenderBuffer连接到框架挡板上,那么Framebuffer还可以将其渲染到具有相同调用的质地中吗? 解决方案 听起来您可能会与FBO使用混淆.如果需要的话,这应该使您入门: Apple开发人员 - 绘制屏幕. a>也可以提供帮助. RenderBuffer是您可以绑定到FBO(FrameBuffer对象)的东西. FBO是当您不希望立即显示渲染时创建的东西,而是想读取渲染结果或对其进行其他渲染. FBO在OpenGL ES 2.0中的工作方式,您只有一个可用的颜色附件(gl
我正在尝试开发一个在Android上使用OpenGL的应用程序,理想情况下它可以在任何像原始Droid一样古老的手机上运行(或至少任何具有OpenGL ES 2.0支持的手机).目前,我正在使用2048x2048 ETC1纹理压缩.它在我正在测试的Droid X上工作正常,但是我目前没有原始的Droid来测试它,而且我也找不到有关此主题的数据.我知道G1在大于512x512的纹理方面做得不好,而机器人似乎可以很好地使用1024x1024的图像,但是2048x2048又如何? (再次,ETC1压缩,因此大约2 MB大).另外,由于ETC1不支持Alpha,我想加载另一个ETC1纹理以支持Alpha通道.这是一个白日梦吗? 基本上,我想知道我必须在没有原始机器人大的Android手机中加载纹理数据多少空间,至少没有整个过程都大大减慢. 解决方案 您可以查询max_texture_size以获取最大纹理大小,也可以在 http://glbenchmark上查找手机. ">在这里)
我正在尝试创建 3通道 CVOpenGLESTexture 我可以通过在CVPixelBufferCreate()中指定kCVPixelFormatType_OneComponent8和GL_LUMINANCE format和internalFormat in CVOpenGLESTextureCacheCreateTextureFromImage()中的kCVPixelFormatType_OneComponent8>. 同样,我可以通过在CVPixelBufferCreate()中指定kCVPixelFormatType_32BGRA和format和format和internalFormat in CVOpenGLESTextureCacheCreateTextureFromImage()中的kCVPixelFormatType_32BGRA来成功创建 4通道 RGBA纹理./p> 我需要创建 3通道,24位,RGB(或BGR)带有可访问像素的纹理. 我似乎找不到正确的参
我想知道理论推理为什么这是可能的:几何的翻译如何与纹理映射有关. 我只能在进行子像素翻译时注意到这种效果,如果由整个像素翻译. 我正在使用拼字图投影,GL_CLAMP_TO_EDGE,GL_NEAREST,片段着色器为highp. 纹理坐标是地图集的一个子区域,但是即使整个地图集映射了整个地图集,我也可以看到失真. 使用OpenGL ES(Android和iOS),但是请在重新序列之前,任何人都可以解释这不是OpenGl中的问题. 我尝试过的事情: Texels的目标中心, 调整.5/width,.5/height,.5/height li> 解决方案 按子像素量移动将始终改变纹理采样.您使用最近的采样会影响对纹理采样的方式,但首先不会采样的坐标.该坐标是两种Tex坐标的函数,跨多边形插值和顶点,这些函数确定多边形如何栅格栅栏以筛选像素. 请记住,要在像素中心进行评估时,要获得完美的纹理对插值的Tex Coords进行采样,请完全位于Texel中心