我正在为iOS编写一个3D应用程序。 我是OpenGL ES 2.0的新手,所以我仍然围绕着编写基本的着色器。 我真的需要根据纹理对我的一些模型实现“发光”效果。 这是一个示例: 。 我正在寻找OpenGL ES 2.0的代码示例。 我在网上find的大多数代码是桌面OpenGL或D3D。 有任何想法吗?
前段时间,我遇到了eglSwapBuffers问题,冻结了手机,并在设备日志中显示以下消息: W/SharedBufferStack( 1110): waitForCondition(LockCondition) timed out (identity=28, status=0). CPU may be pegged. trying again. 我已经在整个networking上看到过关于这个问题的讨论,但是我发现唯一的解决scheme是在glFinish之后调用eglSwapBuffers 。 然而,这个解决scheme导致10-20的百分比下降,这是远远不能接受的。 问题已经打开,可以在这里find 有人评论说,使用方形纹理消除了这个问题。 我刚开始以为他认为他的意思是两个纹理,但是在确定我没有使用任何非二次方的纹理,并且没有摆脱这个问题之后,我开始认为他可能实际上是指纹理匹配宽度和高度? 我正在testingAndroid 2.3.3的HTC Desire。 有人评论说,未来的版本应该已经解决了这个问题,但2.3.3被安装在这么多的设备上,我们不能忽视它。 无论如何,任何人有任何想法呢? 我们已经非常接近发货的头衔,这个问题正在威胁着时间表。
你正在填充值的variables是否指示你正在使用什么精度,在等号的右边? 例如,这里的精度说明符有什么不同之处: gl_FragColor = lowp vec4(1); 这是另一个例子: lowp float floaty = 1. * 2.; floaty = lowp 1. * lowp 2.; 如果你拿一些浮点数,并从它们中创build一个向量或matrix,那么这个向量或者matrix是否会把你填充的值的精度,或者将这些值转换成另一个精度级别? 我认为优化这个问题最能回答这个问题: dot(gl_LightSource[0].position.xyz, gl_NormalMatrix * gl_Normal) 我的意思是,如果你想要尽可能快,还是有些没用,它是否需要走这么远呢? lowp dot(lowp gl_LightSource[0].position.xyz, lowp gl_NormalMatrix * lowp gl_Normal) 我知道你可以定义float的默认精度,而且这个假设可以用于向量和之后的matrix。 为了教育的目的,我们之前已经定义了这一点: precision highp float;
问题(TL; DR) 我的问题从根本上说是我不知道OpenGL ES 2.0如何期望我编写和使用多个着色器; 或者甚至是可取的/预计一个人会这样做。 这里的基本问题是:如果我有一个苹果,一个发光的岩石和一个模糊的网格,都在同一个3D世界,所有最好的绘制与不同的着色器程序,但使用相同的mvpMatrix,那么我将如何去使用所有这些相同的OpenGL渲染,使他们都使用我写的最合适的着色器? 我做了什么 所以我已经为我的Android游戏编写了一个基本的OpenGL ES 2.0程序,它完美地工作,可以将对象的轮廓绘制到屏幕上。 但是别的什么都没有。 非常多,因为着色器看起来像这样: 顶点着色器 uniform mat4 uMVPMatrix; attribute vec4 aPosition; void main() { gl_Position = uMVPMatrix * aPosition; } 片段着色器 void main() { gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); } 现在他们是非常基本的。 我之所以没有走得更远,是因为我不知道是否应该写一个着色器来应用于所有不同的对象,或者我应该使用多个着色器。 如果我应该使用多个着色器来绘制多个不同的对象,那么我怎样才能以一种有效的方式去做呢? 我觉得这对OpenGL ES 2.0日日夜夜的人来说一定是基本的知识,所以我希望有人能回答我的问题,或者指出我的方向是正确的。 我有: 看了多个教程; 没有一个使用除了最基本的着色器之外的任何东西。 阅读整个OpenGL ES 2.0 GLSL规范(没有提到它是如何使用的;它只是做了什么,而不是它如何组合在一起)。 试图修改我的着色器了一下。 所以我希望我接近了解OpenGL的工作stream程,但我似乎还没有在那里。 […]
如何使用OpenGL ES 2.0着色器执行以下image processing任务? 色彩空间转换(RGB / YUV / HSL / Lab) 旋转的图像 转换为草图 转换成油画
我试图通过运行openGLfilter来过滤来自相机硬件的stream,然后将其显示在GLSurfaceView中。 当openGL去渲染框架时,LogCat反复吐出一个错误: [unnamed-3314-0] updateTexImage:清除GL错误:0x502 0x502是一个通用的OpenGL错误,并没有真正帮助我追踪这个问题。 这是代码如何工作的序列(或者至less应该像我的头上看到的那样工作),并且我已经在下面复制了我的代码。 我希望别人能看到我的问题是什么。 创build新的MyGLSurfaceView。 这也在内部创build新的MyGL20Renderer对象。 这个MyGLSurfaceView被设置为内容视图。 一旦MyGLSurfaceView完成了充气/初始化,这个完成事件触发渲染器创build一个DirectVideo绘图对象,该对象编译/链接定义的着色器并将它们添加到openGL程序中。 然后创build一个新的openGL纹理对象,然后用纹理对象ID调用MainActivity。 当从渲染器调用MainActivity方法时,它将使用传递的openGL纹理对象创build一个新的SurfaceTexture对象。 然后它将自己设置为表面的onFrameListener。 然后创build/打开相机对象,将创build的SurfaceTexture设置为videostream的目标,然后启动相机馈送。 当来自Feed的框架可用时,onFrameAvailable将向渲染器发送渲染请求。 这是在openGL线程中调用的,该线程调用SurfaceTexture的updateTexImage(),将帧存储器加载到openGL纹理中。 然后调用DirectVideo的绘图对象,并运行openGL程序序列。 如果我注释掉这个.draw()行,上面提到的错误就消失了,所以看起来问题可能出在这里,但是我不排除它是由不正确的链接/创build的纹理造成的。 MainActivity.java public class MainActivity extends Activity implements SurfaceTexture.OnFrameAvailableListener { private Camera mCamera; private MyGLSurfaceView glSurfaceView; private SurfaceTexture surface; MyGL20Renderer renderer; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); glSurfaceView = new MyGLSurfaceView(this); renderer = glSurfaceView.getRenderer(); setContentView(glSurfaceView); } […]
为OpenGL着色器程序设置属性位置时,您面临两个select: 链接之前glBindAttribLocation()明确定义一个属性位置。 要么 glGetAttribLocation()链接后获得一个自动分配的属性位置。 使用其中一个的效用是什么? 如果有,哪一个在实践中是首选的?
我正在尝试在Linux环境下开发ES 2.0应用程序。 我的目标GPU是富士通rubyMB86298。 为了优化性能,我决定使用VBO概念。 我对维也纳国际组织是很新的。 我使用VBO渲染基本原始像trinagle和四边形,我没有顶点。 为了使用VBO渲染皇冠,我计算了所有的顶点(大于200)。 现在我发现将这200个顶点的数据发送给VBO是很困难的。我不能手动input所有的顶点数据并将其存储在一个数组中,并将其传递给VBO。 有没有办法将每个for循环的顶点数据(用于冠的顶点计算)发送到VBO? 任何人都可以使用VBO共享在ES 2.0中绘制弧形或圆形的代码片段吗?
为了仅仅在xy平面上旋转/平移对象(仅在z轴上旋转和平移),而不仅仅是到全局中心(设备中心),还有其他任意点,我创build了一个algorithm,这是正确的我认为这是正确的), 但是在执行过程中需要花费大量的时间来移除一个不需要的翻译 (algorithm是在8月4日创build的,并且是在同一天实现的,因为代码已经被修改了15次)。 这里是http://www.pixdip.com/opengles/transform.php#ALGO1的实现 产生不需要的翻译的代码行在里面: private static void updateModel(int upDown, float xAngle, float yAngle, float zAngle) { 如下所示: Matrix.multiplyMV(GLES20Renderer._uBodyCentreMatrix, 0, GLES20Renderer._ModelMatrixBody, 0, GLES20Renderer._uBodyCentre, 0); objX = GLES20Renderer._uBodyCentreMatrix[0]; objY = GLES20Renderer._uBodyCentreMatrix[1]; 即使进行了以下更改,沿着+ Y的不期望的翻译仍然存在: objY = _uBodyCentreMatrix[1] – _uBodyCentre[1]; zAngle = 0; ds = 0; 在每次调用onDrawFrame() ,由于Renderer类的这些字段,值-0.545867f被添加到Y坐标: private static final float[] _uBodyCentre = new float[]{-0.019683f, -0.545867f, -0.000409f, […]
我想绘制一个球体,我知道如何在OpenGL中使用诸如glBegin()和glEnd()之类的调用。 但ES中没有任何东西。 build议/教程链接?