Questions tagged «opengl-es2»

OpenGL ES 2.0强调可编程的3D图形管线(与OpenGL ES 1.1的固定功能管线相比)。

5
OpenGL ES 2.0是否可以进行延迟渲染/着色?
我在StackOverflow上问了这个问题,但在这里可能更有意义: 是否有人在OpenGL ES 2.0下实现了延迟渲染/着色?它不支持MRT,因此只有一个颜色缓冲区,因此不能以“常规”方式实现。 具体来说,我正在iPad,iPhone4(maaaybe iPhone 3gs)和Android上进行浏览。在iPad / iPhone4 / iPhone3gs上的GLESView应用程序上,存在GL_OES_RGB8_RGBA8扩展名,但我看起来还不是很深入,但是对于8bits /通道,这个想法很有趣:http : //www.gamedev.net/topic/ 562138-opengl-es-20和递延阴影/ 还有其他想法吗?在性能方面,这是否值得做?

2
OpenGL:我应该在哪里放置着色器?
我正在尝试学习OpenGL ES 2.0,并且想知道“管理”着色器的最常见做法是什么。 我之所以问这个问题,是因为在我发现的示例中(例如与android sdk一起提供的API Demo中包含的示例),我通常会看到GLRenderer类中的所有内容,而我希望将它们分开,这样我就可以拥有例如,一个GLImage对象,无论何时我想绘制带纹理的四边形(我现在仅专注于2D),都可以重用,就像我在OpenGL ES 1.0代码中一样。在我发现的几乎每个示例中,着色器仅定义为类属性。例如: public class Square { public final String vertexShader = "uniform mat4 uMVPMatrix;\n" + "attribute vec4 aPosition;\n" + "attribute vec4 aColor;\n" + "varying vec4 vColor;\n" + "void main() {\n" + " gl_Position = uMVPMatrix * aPosition;\n" + " vColor = aColor;\n" + "}\n"; …

2
GLSL着色器-更改色相/饱和度/亮度
我正在尝试使用GLSL片段着色器更改图像的色调。我想实现类似于Photoshop的“色相/饱和度调整”层的功能。 在下图中,您可以看到到目前为止我得到了什么。我想更改绿色正方形的色相,使其看起来像右边的红色正方形,但是使用此着色器,我得到一个半红色的半粉红色正方形(中间的正方形)。 我在片段着色器中所做的就是将纹理的颜色转换为HSV,然后将从顶点着色器获得的HSV颜色添加到其中,然后将颜色转换回RGB。 我究竟做错了什么? 片段着色器: precision mediump float; varying vec2 vTextureCoord; varying vec3 vHSV; uniform sampler2D sTexture; vec3 convertRGBtoHSV(vec3 rgbColor) { float r = rgbColor[0]; float g = rgbColor[1]; float b = rgbColor[2]; float colorMax = max(max(r,g), b); float colorMin = min(min(r,g), b); float delta = colorMax - colorMin; float …

1
是否应该取消绑定缓冲区?
我正在使用OpenGL ES 2进行一些测试,但遇到了一些问题,我目前的程序是这样的: Init ------- -> create index buffer -> fill index buffer glBufferData … -> create vertex buffer -> fill vertex buffer glBufferData … Draw ------- 1. Apply vertex buffer -> Bind VAO -> bind vertex buffer - enable attributs (glVertexPointer, …) -> unbind vertex buffer -> Unbind VAO …

4
OpenGL ES 2.0中的几何实例化
我打算在OpenGL ES 2.0中进行几何体实例化。基本上,我打算在场景中渲染相同的几何体(一把椅子)大约1000次。 在OpenGL ES 2.0中执行此操作的最佳方法是什么? 我正在考虑将模型视图mat4作为属性传递。由于属性是每个顶点数据,因此我需要传递相同的mat4,因此对于同一三角形的每个顶点都要传递三遍(因为modelview在三角形的各个顶点之间保持不变)。 这将导致发送到GPU的大量额外数据(2个额外的顶点* 16个浮点*(三角形数)数量的额外数据)。 还是应该每个三角形仅发送一次mat4?但是由于属性定义为“每个顶点”数据,使用属性怎么可能呢? 在OpenGL ES 2.0中进行实例化的最佳和有效方法是什么?

4
2D碰撞检测
假设我正在使用此字符。 (来源:iconbug.com) 您将如何实现碰撞检测?使用边界框似乎不是一个很好的近似值,因为这只鸟的形状远不及正方形。 我正在考虑在对象内部具有一种表示图像部分的四叉树数据结构。每片叶子要么是false(如果它覆盖了鸟类外部的白色/透明空间),要么是true(如果它代表了鸟类的某个区域,例如喙,眼睛等)。然后以某种方式测试场景中与鸟类碰撞的唯一障碍。 但是我遇到的问题是: 我不知道如何初始化四叉树。 一旦四叉树被初始化,一旦障碍物在图像坐标内,我就不确定如何遍历和使用它。 如何处理非方形字符的冲突检测? LE:我见过的另一种方法是使用多个边界框。例如,我将为喙提供一个或几个边界框,然后为头发或尾巴添加一些边界框。但这会很乏味。如果对我而言这是一种有效的方法,我将如何生成这些边界框?我怀疑我是否必须在程序中对它们进行硬编码。 LE2:我关心的是相当精确的碰撞。我无法想象单个边界框或圆形如何至少可以像样地近似该形状,因此这种方法行不通。

3
如何在OpenGL中弯曲对象?
有没有一种方法可以使用OpenGL弯曲物体,例如圆柱体或平面? 我是OpenGL初学者(我正在使用OpenGL ES 2.0,尽管这很重要,尽管我怀疑数学在这种情况下最重要,所以它在某种程度上与版本无关),我了解基本知识:平移,旋转,矩阵转换等我想知道是否有一种技术可以允许您实际更改对象的几何形状(在这种情况下,通过弯曲它们)? 欢迎任何链接,教程或其他参考!

1
如何在Android中可靠地实现GPU外观?
我正在尝试让角色皮肤在Android上正常工作。 这个想法很原始:我有我的蒙皮矩阵,并且与每个顶点一起,我最多发送四个矩阵索引和四个相应的权重。我将它们汇总到顶点着色器中,并将其应用于每个顶点。 这就是我在游戏的iOS版本中的顶点着色器中所做的事情(不要介意法线): attribute vec4 in_pos; attribute vec4 in_normal; attribute vec2 in_texture_coords; attribute vec4 in_bone_index; attribute vec4 in_bone_weight; varying vec2 fs_texture_coords; uniform mat4 world_view_projection; uniform mat4 bones[@bind_matrix_count]; void main() { // Skinning vec4 transformed_pos = ((in_pos * bones[int(in_bone_index.x)]) * in_bone_weight.x) + ((in_pos * bones[int(in_bone_index.y)]) * in_bone_weight.y) + ((in_pos * bones[int(in_bone_index.z)]) …

1
利用游戏循环和openGL之间的多线程
在基于openGL渲染器的游戏环境中交谈: 假设有两个线程: 更新游戏中对象的游戏逻辑和物理等 根据游戏对象中的数据对每个游戏对象进行openGL绘制调用(线程1不断更新) 除非您在游戏的当前状态下每个游戏对象都有两个副本,否则您必须暂停线程1,而线程2进行抽奖,否则游戏对象将在该对象的抽奖中途更新。是不可取的! 但是停止线程1以安全地从线程2进行绘制调用会杀死多线程/并发的整个目的 除了使用成百上千或同步对象/围栅之外,还有没有更好的方法可以利用多核体系结构提高性能? 我知道我仍然可以使用多线程为尚未成为当前游戏状态一部分的对象加载纹理和编译着色器,但是如何在不影响绘制和更新的情况下对活动/可见对象执行此操作? 如果我在每个游戏对象中使用单独的同步锁怎么办?这样,任何线程都只会阻塞一个对象(理想情况),而不是整个更新/绘制周期!但是在每个对象上锁定(游戏可能有上千个对象)的代价是多少?

1
OpenGL ES使用纹理创建模具效果
环境 这是我正在工作的环境: OpenGL ES 2.0 iPhone模拟器和iPhone 4 使用NVIDIA GeForce GTX 680MX的iMac 27“ 2048 MB 希望能有所帮助。 问题 正在从多个来源和多个站点(包括Stackoverflow)进行高低搜索,但是没有有效的模具效果。 我所拥有的是: 黑色的“ S” 不是多边形,而是在与背景图像相同的宽度和高度的矩形四边形上绘制的纹理。 我正在尝试做一个模版效果,其中背景和黄色小家伙只有在黑色“ S”纹理内时才可见。 在我的片段着色器中,我有以下内容: varying lowp vec4 destinationColor; varying lowp vec2 TexCoordOut; uniform sampler2D Texture; uniform highp float TexScale; void main() { highp vec4 color = texture2D(Texture, TexCoordOut); if(color.a == …

1
精灵表纹理拾取相邻纹理的边缘
我有一个自定义的精灵例程(openGL 2.0),该例程使用一个简单的精灵表(我的纹理彼此水平排列)。 因此,例如,这是一个带有2个简单纹理的测试精灵表: 现在,我在创建openGL Sprite对象时要做的就是在其图集中指定帧的总数,并且在绘制时指定要绘制的帧。 然后计算出从何处获取纹理的方式: 将所需的帧数除以总帧数(以获得左坐标) 然后将1除以总帧数,然后将结果加到上面计算出的左手坐标上。 这似乎确实有效,但有时会遇到问题。比如说,我想在下面画X,我得到........... 我听说过在每个纹理之间放置1 px的“填充”,但是有人可以确切解释它是如何工作的吗?我的意思是,如果这样做,它肯定会取消获得纹理的计算。 如果我简单地在所拾取的纹理中包括填充(因此使用空白边框绘制精灵),那么这肯定会导致碰撞检测问题吗?(即,当透明零件发生碰撞时,使用边界框时,精灵可能会发生碰撞)。 如果有人可以解释,将不胜感激。

3
如何将多个矩阵发送到顶点着色器?
我正在使用骨骼/蒙皮练习动画。我正在尝试为着色器每个顶点发送一个矩阵。我可以想到这两种方法。 方法一 这样的每个骨基质都有一个统一的手柄 u_Bone0 = GLES20.glGetUniformLocation(mProgram, "u_Bone[0]"); u_Bone1 = GLES20.glGetUniformLocation(mProgram, "u_Bone[1]"); 并在其中onDraw将它们每个发送到着色器: GLES20.glUniformMatrix4fv(u_Bone0, 1, false, matrix0, 0); 如果我有大量矩阵,显然这不是一个好方法。我的第二个想法我还没有尝试过,因为有很多代码可以重构 方法2 是用来glUniformMatrix4fv一次将它们全部发送出去(假设我有20个矩阵) GLES20.glUniformMatrix4fv(u_Bones, 20, false, matrices, 0); 哪里matrices是float[16 * 20]。但是,然后修改每个骨骼的矩阵变得有点乏味。例如,如果我想获得第3个矩阵,则需要 float[] _3rd = Arrays.copy(matrices, 3*16, 4*16); 而保存这些值可能会变得更加烦人。 我现在正在使用方法1,但看起来并不十分聪明... 将多个矩阵发送到OpenGL ES 2着色器的最佳方法是什么? LE:我正在使用Android,因此我正在寻找Java解决方案。

1
优化重型片段着色器的性能
我需要帮助优化以下一组着色器: 顶点: precision mediump float; uniform vec2 rubyTextureSize; attribute vec4 vPosition; attribute vec2 a_TexCoordinate; varying vec2 tc; void main() { gl_Position = vPosition; tc = a_TexCoordinate; } 分段: precision mediump float; /* Uniforms - rubyTexture: texture sampler - rubyTextureSize: size of the texture before rendering */ uniform sampler2D rubyTexture; uniform …

1
gluLookAt如何工作?
据我了解, gluLookAt( eye_x, eye_y, eye_z, center_x, center_y, center_z, up_x, up_y, up_z ); 等效于: glRotatef(B, 0.0, 0.0, 1.0); glRotatef(A, wx, wy, wz); glTranslatef(-eye_x, -eye_y, -eye_z); 但是当我打印出ModelView矩阵时,对的调用glTranslatef()似乎无法正常工作。这是代码片段: #include <stdlib.h> #include <stdio.h> #include <GL/glut.h> #include <iomanip> #include <iostream> #include <string> using namespace std; static const int Rx = 0; static const int Ry …

4
可变长度循环对GPU着色器的影响
它很流行在GPU内渲染程序内容,例如在演示场景中(绘制单个四边形以填充屏幕并让GPU计算像素)。 雷行军很受欢迎: 这意味着GPU正在每个像素执行一些未知数量的循环迭代(尽管您可以将上限设为maxIterations)。 具有可变长度的循环如何影响着色器性能? 想象一下简单的光线行进伪代码: t = 0.f; while(t < maxDist) { p = rayStart + rayDir * t; d = DistanceFunc(p); t += d; if(d < epsilon) { ... emit p return; } } 各种主流GPU系列(Nvidia,ATI,PowerVR,Mali,Intel等)如何受到影响?顶点着色器,尤其是片段着色器? 如何进行优化?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.