Tag: opengl es

圆球上的两个点之间的圆柱方向,Scenekit,四元数IOS

我一直在使用SceneKit在球体的外边缘上的两点之间画一个圆柱体。 我已经使用原始几何和使用SCNRendering Delegate的openGL在这两点之间产生了一条界线,但是现在我需要在这两个点之间产生一个圆柱(好吧,不只是两个,而是任意两个坐在球表面上的3Dvector)。 我已经为此工作了大约3天了,而且我已经完成了四元数的实现,但是现在我无法实现。 学术文章,科学研究,什么也没有,没有什么工作是在两个固定点之间重新排列一个圆柱体。 我需要一个algorithm来做到这一点。 无论如何,这是我最近的代码不起作用,但是这只是我已经完成的近2千行代码的一小段代码,没有预期的结果。 我知道我可以移动到更高级的东西,比如构build我自己的SCNProgram和/或SCNRenderer,然后访问GLSL,OpenGL和Metal复杂性,但是这似乎是应该可以使用Scenekit和GLKit向量结构之间的转换和从SCNVector结构,但到目前为止,这是不可能的: 码: 以下代码获取经度和纬度坐标并将其投影到3D球体的表面上。 这些坐标是通过一个专有函数返回的,我在这里构build了一个在我的3D球体上精确显示的{x,y,z}坐标的SCNVector3。 我在两组经度和纬度坐标之间绘制一条线,用原始线绘制线条穿过球体的中心。 所以,正如我上面提到的,我想要这个function,但是用圆柱体,而不是线(顺便提一下,这里列出的经度和纬度坐标是假的,它们是随机生成的,但都落在地球表面上)。 drawLine = [self lat1:37.76830 lon1:-30.40096 height1:tall lat2:3.97620 lon2:63.73095 height2:tall]; float cylHeight = GLKVector3Distance(SCNVector3ToGLKVector3(cooridnateSetOne.position), SCNVector3ToGLKVector3(coordinateSetTwo.position)); SCNCylinder * cylTest = [SCNCylinder cylinderWithRadius:0.2 height:cylHeight]; SCNNode * test = [SCNNode nodeWithGeometry:cylTest]; SCNMaterial *material = [SCNMaterial material]; [[material diffuse] setContents:[SKColor whiteColor]]; material.diffuse.intensity = 60; material.emission.contents = [SKColor […]

OpenGL ES着色器和64位iPhone 5S

我刚刚开始在OpenGL ES应用程序上testingiPhone 5S和64位体系结构。 我看到的问题是(CGFloat)值到达着色器时是错误的。 当我debugging着色器时,我传入0.8,并更改为-1.58819e-23。 我正在使用glUniform4fv()传入值。 我需要使用不同的数据types还是? 或不同的方法来传递值? 当我在32bit上testing的时候,这个值很好 CGFloat brushColor[4]; brushColor[0] = 0.8; brushColor[1] = 0.1; brushColor[2] = 0.1; brushColor[3] = 0.3; glUniform4fv(program[PROGRAM_POINT].uniform[UNIFORM_VERTEX_COLOR], 1, brushColor); (你们有些人可能会注意到这是来自GLPaint演示…) 谢谢, 奥斯汀

如何避免在iOS OpenGL ES应用程序的自动转换中出现短暂的延伸

这近来一直在困扰着我。 将一个支持纵向和横向的OpenGL ES应用程序放在一起非常简单。 但是在自动旋转过程中,系统似乎只是将渲染缓冲区强制拉伸到新维度,自动旋转,然后调用通常的-layoutSubviews – > -resizeFromLayer:等等,以便可以将可绘制对象调整到新的视口维度。 我见过的大多数支持纵向和横向的应用程序似乎都适合这种简单的方法。 但是我想知道我能做得更好吗? 也许我应该在它发生之前拦截自动旋转(使用UIViewController的通常方法),一旦渲染缓冲区“扩大”到最长屏幕尺寸的完美平方(例如,iPhone 5上的1136px x 1136px) – 这样,在屏幕外出血,执行自转(没有渲染缓冲区大小的变化,因此没有拉伸,就像在两个风景方向之间切换时一样),最后再次调整帧缓冲区,以便在屏幕之外处理不可见的“浪费的”边距。 (当然,我可以一直有一个方形的帧缓冲器,但这将是低效的填充方式) 有什么build议么? 有没有更好的方法来实现这一点,我没有想过? 编辑 我修改了我的-resizeFromLayer:代码,如下所示: CGRect bounds = [layer bounds]; // Enlarge layer to square of the longest side: if (bounds.size.width < bounds.size.height) { bounds.size.width = bounds.size.height; } else{ bounds.size.height = bounds.size.width; } [layer setBounds:bounds]; // Adjust size to match […]

在Open ES iPhone应用程序中围绕VBO使用VAO在调用glDrawElements时导致EXC_BAD_ACCESS

我正试图把我的代码提高到一个新的水平。 遵循苹果的一些最佳实践,我试图围绕我的顶点缓冲对象(VBO)实现顶点数组对象。 我设置了我的VBO和VAO: – (void)setupVBOs { glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); glBindVertexArrayOES(0); { glGenVertexArraysOES(1, &directArrayObject); glBindVertexArrayOES(directArrayObject); // GLuint texCoordBuffer; glGenBuffers(1, &texCoordBuffer); glBindBuffer(GL_ARRAY_BUFFER, texCoordBuffer); glBufferData(GL_ARRAY_BUFFER, sizeof(DirectVertices), DirectVertices, GL_STATIC_DRAW); glVertexAttribPointer(directPositionSlot, 2, GL_FLOAT, GL_FALSE, sizeof(DirectVertex), (GLvoid*)offsetof(DirectVertex, position)); glEnableVertexAttribArray(directPositionSlot); glVertexAttribPointer(texCoordSlot, 2, GL_UNSIGNED_BYTE, GL_FALSE, sizeof(DirectVertex), (GLvoid*)offsetof(DirectVertex, texCoord)); glEnableVertexAttribArray(texCoordSlot); glGenVertexArraysOES(1, &arrayObject); glBindVertexArrayOES(arrayObject); // GLuint vertexBuffer; glGenBuffers(1, &vertexBuffer); glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, […]

顶点数组对象(VAO)可以在OpenGL ES的EAGLContext中共享吗?

扰stream板:我相当有信心,答案是NO ,但这只是一个非常沮丧的debugging后一天。 现在我想知道这是否确实如此(如果是这样,我可能已经知道了),或者我只是在做一些完全错误的事情。 这是情况。 我正在使用OpenGL ES 2.0来呈现从各种文件(.obj,.md2等)加载的一些网格。 为了性能和用户体验,我使用GCD将这些网格及其关联纹理的实际加载委托给后台线程。 根据Apple的 说明 ,在每个后台线程上,我使用与主渲染上下文相同的shareGroup创build并设置了一个新的EAGLContext。 这允许在后台线程上创build的OpenGL对象,如纹理和缓冲区对象,被主线程上下文立即使用。 这一直是出色的。 现在,我最近了解到顶点数组对象是一种caching与渲染某些缓冲区内容相关的OpenGL状态的方法。 它看起来不错,并减less了样板状态检查和设置渲染每个网格所需的代码。 最重要的是,苹果公司还build议在“ 使用顶点数据的最佳实践指南”中使用它们。 但是我有严重的问题让VAO为我工作。 就像我所有的加载,我会加载网格从一个文件到后台线程的内存,然后生成所有相关的OpenGL对象。 没有失败,我第一次尝试使用VAO调用glDrawElements() ,该应用程序崩溃与EXC_BAD_ACCESS 。 没有VAO,它渲染罚款。 debuggingEXC_BAD_ACCESS是一件很痛苦的EXC_BAD_ACCESS ,特别是当NSZombies不会帮助的时候(他们显然不会这么做),但是在分析捕获的OpenGL帧之后,我意识到,在后台线程创buildVAO的时候没有问题GL_ERROR和一个非零的id),当时间绑定到主线程上的VAO,我会得到一个GL_INVALID_OPERATION ,当试图绑定到一个不存在的VAO时,文档状态将会发生。 当然,在渲染时查看当前上下文中的所有对象时,不会看到单个VAO, 但是所有在同一时间内由VAO生成的VBO都存在 。 如果我在主线程加载VAO,它工作正常。 非常令人沮丧。 我将加载代码提炼成更primefaces的forms: – (void)generate { glGenVertexArraysOES(1, &_vao); glBindVertexArrayOES(_vao); _vbos = malloc(sizeof(GLuint) * 4); glGenBuffers(4, vbos); } 当在后台线程上执行上述操作时,使用与主要上下文具有相同shareGroup的有效EAGLContext ,主要上下文将有4个VBO,但不包含VAO。 如果我在主线上执行它,主要内容是4个VBO和VAO。 这使我得出这样的结论:在处理VAO时,EAGLContext的对象共享特性存在一些奇怪的例外。 如果真的是这样的话,我真的希望苹果的文档在某处注意到。 手工发现这些小花絮是非常不方便的。 这是这种情况,还是我错过了什么?

在iOS上的CVOpenGLESTextureCache vs glTexSubImage2D

我的OpenGL应用程序使用OpenGL来全屏渲染纹理,并定期更新其中的一部分。 到目前为止,我一直在使用glTexImage2D推我的初始纹理,然后我用glTexSubImage2D更新脏区域。 要做到这一点,我使用单缓冲。 这很好。 我已经看到,可能有另一种方法来使用CVOpenGLESTextureCache实现相同的事情。 保存在纹理caching中的纹理引用一个CVPixelBuffer。 我想知道是否可以改变这些caching的纹理。 我试图为每个更新重新创build一个CVOpenGLESTexture,但这大大降低了我的帧速率(不要惊讶,因为我没有指定脏区域)。 也许我完全误解了这个纹理caching的用例。 有人可以提供一些指导? 更新:这是我正在使用的代码。 第一次更新工作正常。 后续更新不(没有发生)。 每次更新之间我修改原始位图。 if (firstUpdate) { CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, ctx, NULL, &texCache); CVPixelBufferRef pixelBuffer; CVPixelBufferCreateWithBytes(NULL, width_, height_, kCVPixelFormatType_32BGRA, bitmap, width_*4, NULL, 0, NULL, &pixelBuffer); CVPixelBufferLockBaseAddress(pixelBuffer, 0); CVOpenGLESTextureRef texture = NULL; CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, texCache, pixelBuffer, NULL, GL_TEXTURE_2D, GL_RGBA, width_, height_, GL_BGRA, GL_UNSIGNED_BYTE, 0, &texture); […]

如何衡量OpenGL ES的真正的FPS性能?

我意识到这是两件不同的事情: 绘图,并在屏幕上获取它。 因此,虽然您可以以每秒60次的速度从CADisplayLink中抽取一次,但如果您的绘图操作时间略长于1/60秒,理论上最终会达到30 FPS,因为您错过了其他所有机会通过渲染pipe道。 好; 知道这一点,记住NSTimeInterval开始并在运行循环中增加一个帧计数器,然后检查是否有第二个已经通过,并计算最后一秒通过的FPS,这似乎是无稽之谈。 我想要一种方法在屏幕上真正从OpenGL ES获得真正的FPS值。 我查看了Xcode 3.2.6中的工具,但找不到一个。 但是我记得有一种方法可以获得FPS的价值。 真正的 怎么样?

opengles在iphone中显示人脸

我需要做一个人脸2D面对3D面孔。 我用这个链接加载一个“.obj”文件并映射纹理。 这个例子只适用于立方体和金字塔。 我加载了一个人脸“.obj”文件。 这加载.obj文件,并可以正确获取人脸,如下所示。 但我的问题是我需要显示不同的人脸而不改变“.obj”文件。 只是通过纹理映射。 但是由于obj文件是不同的模型,纹理没有得到正确的映射。 我只是尝试更改用作纹理的“.png”文件,下面是纹理映射的结果,但不是我所期望的,如下所示。 以下是我的几个问题: 1)我需要加载不同的图像相同的模型(具有相同的.obj文件)的纹理。 在opengles中可能吗? 2)如果上述问题的解决scheme是“形状匹配”,那么我怎么用opengles呢? 3)最后一个基本问题,我需要大面积的显示图像,如何使显示区域更大?

将图像分成OpenGLES中的小四边形网格

如何将图像分割成OpenGLES的小四边形网格。 我需要将图像分成小部分,之后只能拉伸图像的一部分,而不是整个图像。 是否有可能使用OpenGL ? 我是OpenGL新手。 在编辑头发图像之前 并在编辑之后像头发一样 因此,图像从任何一方以任何方式延伸。

顶点着色器中的纹理查找在iPad设备与iPad模拟器上performance不同 – OpenGL ES 2.0

我有一个顶点着色器,我做纹理查找来确定gl_Position。 我将它用作GPU粒子模拟系统的一部分,粒子位置存储在纹理中。 看来: vec4 textureValue = texture2D(dataTexture, vec2(1.0, 1.0)); 在模拟器上的行为与iPad设备不同。 在模拟器上,纹理查找成功(该位置的值为0.5,0.5),我的粒子出现在那里。 但是,在iPad本身,纹理查找不断返回0.0,0.0。 我已经尝试了格式GL_FLOAT和GL_UNSIGNED_BYTE的纹理。 有没有人经历过这个? GLSL ES规范说纹理查找可以在顶点和片段着色器中完成,所以我没有看到问题是什么。 我正在使用iOS SDK 4.2的最新通用testing版