我想为iPhone编写一个棋盘游戏(类似于跳棋).OpenGL ES或CoreGraphics会是更好的选择吗?App Store上大多数此类游戏都使用什么?
我正在开发一款游戏,我希望在网格上的一系列精灵下创建阴影.阴影大于精灵本身,精灵是动画的(即移动和旋转).
我不能简单地将它们渲染到精灵png中,否则阴影会与相邻的精灵重叠.
我也不能简单地将阴影放在较低的层上,因为当它们重叠时,它们会在它们的交叉处产生暗带.
这些精灵是动画的,因此不可能整体渲染这些精灵.
基本上,我希望精灵的阴影能够融合在一起,使它们在设定的不透明度下最大化.例:
我相信这相当于一个openGL混合(Rs,Gs,Bs,Max(As,Ds)),我并不真正关心R,G和B,因为它在src中始终是相同的颜色和dst.
但是,这不是有效的openGL混合模式.有没有一种简单的方法来实现这一点,尤其是在cocos2d-iphone中?
我可以通过使阴影精灵不透明,然后将它们应用于父精灵,并使父精灵40%不透明度来近似.但是,cocos2d的工作方式,这只会将每个子项的不透明度设置为40%,而不是组合的精灵图像,这会产生相同的条带.
OpenGL ES 2.0是否仍支持glPushMatrix和glPopMatrix?我目前正在以下列方式使用它们:
glPushMatrix();
glTranslatef(xLoc, yLoc, 0);
[myTexturePointer drawAtPoint:CGPointZero];
glPopMatrix();
Run Code Online (Sandbox Code Playgroud)
我问,因为我已经阅读了一些关于2.0"从规范中删除矩阵堆栈"的事情.由于我对OpenGL相对较新,我不知道在哪里可以找到明确的答案.
嘿! 我正在寻找一个OpenGL库/框架来处理基本的绘图代码等.否则我也在寻找一些NDK和OpenGL ES教程,我似乎无法找到任何东西!
任何信息都会有所帮助.
亚当
我刚刚开始使用OpenGL ES 2.0,我想做的是创建一些简单的2D输出.如果分辨率为480x800,我该如何绘制背景纹理?
[我的开发环境是Java/Android,因此与此直接相关的示例最好,但其他语言也没问题.]
我有许多粒子,每个帧都会改变顶点.当前正在使用"客户端"内存中的顶点数组绘制顶点.如果我使用顶点缓冲区对象,我可以期待什么性能特征?
因为我必须使用一些glBuffersubData来更新粒子顶点,所以我无论如何都要将每个帧的顶点转移到视频内存(就像我使用常规顶点数组一样)?在这种情况下,VBO有什么好处吗?
这适用于iOS设备.实际的绘制调用:glDrawElements(GL_POINTS,num_particles,GL_UNSIGNED_SHORT,pindices);
我应该使用GL_STREAM_DRAW或GL_DYNAMIC_DRAW?
我想找出支持openGLES 1.0,1.1,2.0的Android手机系列.我相信我可以使用1.1而且应该覆盖90%以上的手机,但是要确定能够找到任何统计信息.我试过谷歌但到目前为止没什么用处.
谢谢.
我的顶点由具有以下结构的数组组成:
[ Position ][ colour ]
[float][float][float][byte][byte][byte][byte]
Run Code Online (Sandbox Code Playgroud)
传递顶点位置没有问题:
gl.bindBuffer(gl.ARRAY_BUFFER, this.vbo);
gl.vertexAttribPointer(this.material.aVertexPosition, 3, gl.FLOAT, false, 4, 0);
Run Code Online (Sandbox Code Playgroud)
但我无法弄清楚如何将颜色传递给着色器.不幸的是,在glsl着色器中使用整数是不可能的,所以我必须使用浮点数.如何将无符号字节颜色值转换为glsl浮点颜色值?我为r,g和b做了这样的尝试,但颜色都搞砸了:
gl.bindBuffer(gl.ARRAY_BUFFER, this.vbo);
gl.vertexAttribPointer(this.material.aR, 1, gl.BYTE, false, 15, 12);
Run Code Online (Sandbox Code Playgroud)
顶点着色器(colouredPoint.vs)
precision highp float;
attribute vec3 aVertexPosition;
attribute float aR;
attribute float aG;
attribute float aB;
uniform mat4 world;
uniform mat4 view;
uniform mat4 proj;
varying vec3 vVertexColour;
void main(void){
gl_PointSize = 4.0;
gl_Position = proj * view * world * vec4(aVertexPosition, 1.0);
vVertexColour = vec3(aR, aG, aB);
}
Run Code Online (Sandbox Code Playgroud)
像素着色器(colouredPoint.fs)
precision highp float;
varying vec3 …Run Code Online (Sandbox Code Playgroud) 对于我目前的项目,我正在阅读iPhone的主摄像头输出.然后我通过以下方法将pixelbuffer转换为缓存的OpenGL纹理:CVOpenGLESTextureCacheCreateTextureFromImage.这在处理用于预览的相机帧时非常有用.使用iPhone 3GS,4,4S,iPod Touch(第4代)和IOS5,IOS6进行不同组合测试.
但是,对于具有非常高分辨率的实际最终图像,这仅适用于以下组合:
这不适用于:iPhone 4 + IOS6.
控制台中的确切错误消息:
Failed to create IOSurface image (texture)
2012-10-01 16:24:30.663 GLCameraRipple[676:907] Error at CVOpenGLESTextureCacheCreateTextureFromImage -6683
Run Code Online (Sandbox Code Playgroud)
我通过改变Apple的GLCameraRipple项目来解决这个问题.你可以在这里查看我的版本:http://lab.bitshiftcop.com/iosurface.zip
以下是我将stilloutput添加到当前会话的方法:
- (void)setupAVCapture
{
//-- Create CVOpenGLESTextureCacheRef for optimal CVImageBufferRef to GLES texture conversion.
CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [EAGLContext currentContext], NULL, &_videoTextureCache);
if (err)
{
NSLog(@"Error at CVOpenGLESTextureCacheCreate %d", err);
return;
} …Run Code Online (Sandbox Code Playgroud) 我遇到了背面(光线)和阴影贴图的问题,我似乎无法通过.我仍处于优化引擎的相对早期阶段,但是我似乎无法实现这一点,即使手动调整这一块几何形状,它仍然看起来像垃圾.
它是一个瘦墙,通过约5个不同的墙块"弯曲".当我创建我的深度图时,我正在剔除前脸(对光线).这肯定有帮助,但是墙的另一侧的正面似乎是导致z战斗/投射阴影.

截图上的一些注释:
正如这里提到的那样,你得出的结论是,你不应该遮住光线背面的多边形.我正在努力解决这个问题,因为我不想将面法线一直传递到片段着色器以排除那里真正的背面 - 但是如果有人觉得这是最好的/唯一的解决方案这种几何形状就是我必须要做的.考虑到管道如何不容易/明显地通过面法线通过它让我觉得这不是阻力最小的路径.请注意,我传递的法线是顶点法线,以允许边缘周围更柔和的光照效果(可能包括非阴影和阴影表面).
请注意,我有一些讨厌的透视别名,但我希望我接下来的步骤是在级联阴影贴图上工作,但是如果不解决这个问题,我觉得我只是推迟了不可避免的事情,因为我已经把视图作为手工收紧了我能做到最好(或者我认为).
无论如何我觉得我错过了什么,所以如果你有任何想法或帮助,将非常感激!
编辑
需要明确的是,根据光线的来源,墙壁在技术上不应该是阴影.

下面是阴影关闭的图像.这只是使用顶点法线来计算漫反射光照 - 它不漂亮(太多几何体是可见的),但它确实显示某些边缘有些可见.

所以是的,墙应该在阴影中,但我希望我可以让平滑效果更好,所以边缘可以有一些漫射光.如果我需要将它完全放在阴影中,那么如果它的阴影贴图将它置于阴影中,或者我的代码专门将它置于阴影中,因为面部法线不在,我对此很好 - 但将面部正常通过到我的顶点/片段着色器似乎不是阻力最小的路径.
也许这些将有助于更好地说明我的问题,或者可能揭示我缺少的一些基本理解.
编辑#2
我在下面加入了深度纹理.你可以在左下方看到有问题的墙,从截图中你可以看到我如何将深度值修剪为~0.4-> 1.这意味着该墙的深度值从0.4范围开始.所以它没有完美地剪裁它,但它的接近.这看起来合情合理吗?我很确定它是一个完整的24或32位深度缓冲区,是iOS上的DEPTH_COMPONENT扩展.对于@starmole,这有助于确定我的投影中是否存在缩放误差?你认为我的地图覆盖的尺寸/面积是否太大,因此如果它靠近它可能有帮助吗?
