Tag: opengl es 2.0

使用未声明的标识符“gl_InstanceID”

大家好,我一直在iOS平台上尝试OpenGLES2.0中的Instanced绘图。 我的渲染代码 glEnableVertexAttribArray(…); glVertexAttribPointer(…) glDrawElementsInstancedEXT(GL_TRIANGLES,IndicesCount, GL_UNSIGNED_SHORT, 0, 5); 和我的顶点着色器 attribute vec4 VertPosition; uniform mat4 mvpMatrix[600]; void main() { gl_Position = (mvpMatrix[gl_InstanceID]) * VertPosition; } 我收到错误:使用未声明的标识符'gl_InstanceID' 我的glsl版本是1.0,如果版本是问题,那我该如何升级? 任何其他方式在GLSL中使用“gl_InstanceID”?

如何使用OpenGL ES 2.0旋转对象?

在OpenGL ES 1.1中,可以使用glRotatef()来旋转模型,但OpenGL ES 2.0中不存在该函数。 因此,如何在OpenGL ES 2.0中执行旋转?

OpenGL ES 2.0多个着色器程序 – 纹理渲染不再工作

我的应用程序绘制了点精灵和标准四方纹理的混合。 直到最近,我还是使用了一个着色器程序 – 但片段着色器中的一个分支(决定是否使用点精灵坐标/颜色)严重限制了我的渲染性能。 我的片段着色器最初看起来像这样: precision highp float; uniform sampler2D u_textureSprite; uniform bool u_isSprite; varying vec4 v_color; varying vec2 v_textureCoord; void main() { vec4 textureColor = texture2D(u_textureSprite, u_isSprite ? gl_PointCoord : v_textureCoord); if (u_isSprite) { gl_FragColor = v_color * textureColor; } else { gl_FragColor = textureColor; } } 在OpenGL ES编程指南中读取Apple的build议使得使用多个着色器程序听起来像是一件容易的事情…只需创build另一个正常的程序,并在相关绘制代码之前调用glUseProgram()。 但是,由于这样做,我不能让纹理渲染工作。 两个新的片段着色器是: pointSprite.fsh: precision highp […]

使用OpenGL ES纹理caching而不是glReadPixels来获取纹理数据

在iOS 5中,引入了OpenGL ES纹理caching,以提供从摄像机video数据到OpenGL的直接方式,而无需复制缓冲区。 在会话414 – WWDC 2011的OpenGL ES for iOS 5中进行了纹理caching的简要介绍。 我发现了一篇有趣的文章 ,最后进一步滥用了这个概念,并且通过简单地locking纹理,然后直接访问缓冲区来绕过对glReadPixels的调用。 由于iPad 2中使用的基于图块的渲染器(即使只使用1×1纹理), glReadPixels的速度非常慢。 但是,所描述的方法似乎处理比glReadPixels更快。 文章中提出的方法是否有效,是否可以用来提升依赖glReadPixels应用程序? 由于OpenGL处理​​与CPU并行的graphics数据, CVPixelBufferLockBaseAddress调用如何知道什么时候渲染完成而不与OpenGL交谈?

iOS上的OpenGL ES 2.0对象拾取(使用颜色编码)

这可能是一个相关的问题: iOS上的OpenGL ES 2.0对象拾取 哪个说颜色select器是一个很好的解决scheme,并在阅读后的行动: http://www.lighthouse3d.com/opengl/picking/index.php?color1 这似乎是一个非常简单的解决scheme,所以这使我想到了这个问题 在iPhone上的OpenGL ES颜色select 不幸的是使用opengl es 1.0,我想在2.0中做到这一点,所以我没有访问该问题中描述的function。 但是这个理论看起来很简单,我想我应该这样做: 触摸开始,我用独特的颜色呈现我的对象。 触摸结束时,我从该位置获取像素,并检查它的颜色来获取我的对象。 (可能与glReadPixels) 问题是我不知道如何做“渲染到后台缓冲区并从中读取”。 我的代码到目前为止只是使用“绘制”,我怀疑我不得不做一些像glBind 另一个缓冲区,但我将不胜感激一些帮助。 我的绘图代码是这样的: glClearColor(0, 0, 0, 0.0); glClear(GL_COLOR_BUFFER_BIT); // Set the Projection Matrix GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(60), 2.0/3.0, 0, 50); glUseProgram(_programHD); glBindVertexArrayOES(_vao); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, _textureBuffer[1]); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glUniform1i(uniforms[UNIFORM_TEXTURE_HD], […]

iOS上的视网膜屏幕的着色器优化

我做了一个使用很多广告牌的3D iphone应用程序。 我的帧缓冲区是视网膜屏幕上的两倍,因为我想提高他们在iPhone 4的质量。问题是片段着色器消耗更多的时间由于帧缓冲区的大小。 有没有一种方法来pipe理视网膜屏幕和高清纹理,而不增加阴影的精度?

最有效的多纹理方式 – iOS,OpenGL ES2,优化

我试图find在iOS上的OpenGL ES2中处理多纹理的最有效的方法。 “高效率”是指即使在较老的iOS设备(iPhone 4及更高版本)上也是最快的渲染 – 同时也是平衡方便。 我考虑过(并尝试过)几种不同的方法。 但遇到了一些问题和疑问。 方法1 – 我的基础和正常值是没有ALPHA rgb。 对于这些对象,我不需要透明度。 我的发射和镜面reflection信息只有一个频道。 为了减lesstexture2D()调用我想我可以存储发射作为基地的alpha通道,镜面作为正常的alpha。 每个人都在他们自己的文件中看起来像这样: 到目前为止,我的问题一直在find一个文件格式,将支持完整的非预乘alpha通道。 PNG只是没有为我工作。 每一个我试图把这个保存为PNG的方法都是将.alg与.rgb保存在一起(通过photoshop),基本上破坏了.rgb。 当我重新加载文件时,任何具有0.0阿尔法的像素都有黑色的rgb。 我在这里发布了这个问题没有任何活动。 我知道这种方法会产生更快的渲染,如果我能find一种方法来保存和加载这个独立的第四频道。 但到目前为止,我还没有能够,只好继续前进。 方法2 – 当没有工作,我转向一个单一的4路纹理,每个象限有不同的地图。 这不会减lesstexture2D()调用,但会减less在着色器中访问的纹理数量。 4路纹理确实需要修改着色器中的纹理坐标。 对于模型的灵活性,我将texcoords放在模型的结构中,并在着色器中修改它们,如下所示: v_fragmentTexCoord0 = a_vertexTexCoord0 * 0.5; v_fragmentTexCoord1 = v_fragmentTexCoord0 + vec2(0.0, 0.5); // illumination frag is up half v_fragmentTexCoord2 = v_fragmentTexCoord0 + vec2(0.5, 0.5); // shininess frag […]

– 第二次失败?

我正在开发一个iOS的OpenGL ES应用程序。 我正在做通常的EAGLView / ES2Render的东西。 启动时,frambuffer创build成功,使用以下代码: – (BOOL) createFramebuffers { [EAGLContext setCurrentContext:_mainContext]; // [ A ] On-screen // 1. Framebuffer glGenFramebuffers(1, &_mainFramebuffer); bindFramebuffer(_mainFramebuffer); // 2. Color buffer glGenRenderbuffers(1, &_mainColorbuffer); bindRenderbuffer(_mainColorbuffer); // Adjust size to view's layer: CAEAGLLayer* layer = (CAEAGLLayer*)[_view layer]; if (![_mainContext renderbufferStorage:GL_RENDERBUFFER fromDrawable:layer]) { // something went horribly wrong NSLog(@"-[ES2Renderer createFramebuffers]: Failed to […]

为什么将GL_ELEMENT_ARRAY_BUFFER绑定到0会产生一个memmove错误?

我有一个错误,我花了相当一段时间来修复。 我不断收到EXC_BAD_ACCESS和一个引用memmove错误,没有任何进一步的描述,直到我评论以下行: [self loadShaders]; glGenVertexArraysOES(1, &_vao); glBindVertexArrayOES(_vao); // Vertex Buffer glGenBuffers(1, &_vertexBuffer); glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer); glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW); glEnableVertexAttribArray(ATTRIB_VERTEX); glVertexAttribPointer(ATTRIB_VERTEX, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0); glEnableVertexAttribArray(ATTRIB_TEXTURE); glVertexAttribPointer(ATTRIB_TEXTURE, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*) (sizeof(float) * 7)); // Index Buffer glGenBuffers(1, &_indexBuffer); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Indices), Indices, GL_STATIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER,0); ////////// COMMENTED THIS ONE ////////////// //glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);// //////////////////////////////////////////// glBindVertexArrayOES(0); […]

在iOS中加载4通道纹理数据

我想从iOS中的文件加载4通道纹理数据,所以我将纹理视为(连续)地图 [0,1]x[0,1] -> [0,1]x[0,1]x[0,1]x[0,1] 如果我使用fileformat .png ,则XCode / iOS会将该文件视为图像,并将每个组件rgb与(预乘alpha)相乘,从而损坏我的数据。 我应该如何解决这个问题? 例子可能是 使用两个纹理与组件rgb (3通道) postadvide阿尔法 使用另一种文件格式 其中,我认为最好的解决scheme是使用另一种文件格式。 GL压缩的文件格式(PVRTC?)不是苹果平台独立的,似乎是低分辨率(4位)( 参考 )。 编辑:如果我自己的答案如下,这是不可能得到在iOS的4通道数据的PNG的。 由于OpenGL是关于创build图像而不是呈现图像,因此应该可以以某种方式加载4通道数据。 PNG是图像的文件格式( 压缩取决于所有4个通道 但是一个频道的压缩与其他频道无关),所以有人可能会说我应该使用另一种文件格式。 那么,我应该使用哪些其他压缩文件格式,这很容易在iOS中读取/集成? 更新:“组合”提到了加载4通道非预乘纹理的方式,所以我不得不给他正确的答案。 但是,这个解决scheme有一些我不喜欢的限制。 我的下一个问题是“从iOS中的png文件访问原始的4通道数据”:) 我认为这是一个不好的库devise,不能读取4通道PNG数据。 我不喜欢系统比我自己更聪明。