我正在为我的下一个Android游戏编写一个OpenGL ES驱动的框架.目前我支持三种绘制精灵的不同技巧:
OpenGL ES 1.0支持顶点阵列,因此在每个Android设备中都支持.我猜大多数(如果不是全部)当前设备也支持VBO和draw_texture.
我不想猜测,而是想知道不同设备支持的扩展.如果大多数设备支持VBO,我可以简化我的代码并只关注VBO + draw_texture.
了解不同设备支持的内容会很有帮助,因此如果您有Android设备,请报告扩展名单.:)
String extensions = gl.glGetString(GL10.GL_EXTENSIONS);
Run Code Online (Sandbox Code Playgroud)
我有一个HTC Hero,所以我可以接下来分享这些扩展.
在learnwebgl tutorial1中,我在片段着色器中发现了一条有趣的行.
precision mediump float;
Run Code Online (Sandbox Code Playgroud)
我在这里发现了一篇关于它的文章,但我仍然无法理解这是什么意思?
如果我删除这一行,没有任何变化.一切都是一样的.那precision mediump float意味着什么?
目前BlendModes(减去,排除等)使用LauncherImage作为掩码.我可以将这些BlendModes应用于ColorMatrix吗?
我正在使用GPUImageLibrary:
colorMatrix[
0.393, 0.7689999, 0.18899999, 0, 0,
0.349, 0.6859999, 0.16799999, 0, 0,
0.272, 0.5339999, 0.13099999, 0, 0,
0, 0, 0, 1, 0];
Run Code Online (Sandbox Code Playgroud)
SubtractBlendFilter.java
public class GPUImageSubtractBlendFilter extends GPUImageTwoInputFilter {
public static final String SUBTRACT_BLEND_FRAGMENT_SHADER = "varying highp vec2 textureCoordinate;\n" +
" varying highp vec2 textureCoordinate2;\n" +
"\n" +
" uniform sampler2D inputImageTexture;\n" +
" uniform sampler2D inputImageTexture2;\n" +
" \n" +
" void main()\n" +
" {\n" +
" lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate);\n" +
" …Run Code Online (Sandbox Code Playgroud) 我一直在我的Android代码中使用FloatBuffers一段时间(从一些opengles教程复制它),但我无法准确理解这个构造是什么以及为什么需要它.
例如,我在许多人的代码和android教程中看到的这段代码(或类似代码):
float[] vertices = ...some array...
ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4);
vbb.order(ByteOrder.nativeOrder()); // use the device hardware's native byte order
FloatBuffer fb = vbb.asFloatBuffer(); // create a floating point buffer from the ByteBuffer
fb.put(vertices); // add the coordinates to the FloatBuffer
fb.position(0); // set the buffer to read the first coordinate
Run Code Online (Sandbox Code Playgroud)
这看起来非常冗长和混乱,据我所知,这只是一个漂浮的数组的花哨包装.
问题:
这种类(ByteBuffer,FloatBuffer)的理由是什么,而不是任何其他类型的集合或简单的浮点数组?
在将ByteBuffer转换为FloatBuffer之前创建ByteBuffer背后的想法是什么?
我正在开发各种游戏框架,并且是OpenGL的新手.大多数书籍似乎都没有对这个问题给出非常明确的答案,我希望使用OpenGL在我的桌面上进行开发,但是在OpenGL ES 2.0环境中执行代码.我的问题是双重的:
我正在寻找一种与GLSL一起使用的工具.我想在WebGL应用程序中试验着色器,所以我正在寻找的东西就像RenderMonkey.据我所知 - RenderMonkey不再受支持,因此必须有一些其他工具才能占据它的位置.
如果我能像RM一样完成"效果组合"和原始GLSL代码开发,那将是最好的.
我正在为iOS编写3D应用程序.我是OpenGL ES 2.0的新手,所以我还在自己编写基本的着色器.我真的需要根据纹理对我的一些模型实现"辉光"效果.
这是一个示例:
.
我正在寻找OpenGL ES 2.0的代码示例.我在互联网上找到的大多数代码都是桌面OpenGL或D3D.
有任何想法吗?
我试图通过openGL过滤器运行来自相机硬件的流,然后在GLSurfaceView中显示它.当openGL去渲染帧时,LogCat会反复发出错误:
[unnamed-3314-0] updateTexImage:清除GL错误:0x502
0x502是一个通用的openGL错误,并没有真正帮助我追踪问题.这是一个代码如何工作的序列(或者至少应该像我脑中看到的那样工作),并且我已经将代码复制到了下面.我希望别人能看出我的问题是什么.
- 创建新的MyGLSurfaceView.这也在内部创建了新的MyGL20Renderer对象.此MyGLSurfaceView设置为内容视图.
- 一旦MyGLSurfaceView完成膨胀/初始化,此完成事件将触发渲染器创建DirectVideo绘图对象,该对象编译/链接定义的着色器并将它们添加到openGL程序.然后它创建一个新的openGL纹理对象,然后使用纹理对象ID回调MainActivity.
- 从渲染器调用MainActivity方法时,它会使用传递的openGL纹理对象创建一个新的SurfaceTexture对象.然后它将自己设置为表面的onFrameListener.然后创建/打开相机对象,将创建的SurfaceTexture设置为视频流的目标,然后启动相机源.
- 当Feed中有一个框架时,onFrameAvailable会向渲染器发送渲染请求.这是在openGL线程上获取的,该线程调用SurfaceTexture的updateTexImage(),它将帧内存加载到openGL纹理中.然后它调用DirectVideo的绘图对象,并运行openGL程序序列.如果我注释掉这个.draw()行,上面提到的错误消失了,所以看起来这个问题很可能就在这里,但我并不认为这是由于链接/创建不正确的纹理造成的.
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);
}
public void startCamera(int texture)
{
surface = new SurfaceTexture(texture);
surface.setOnFrameAvailableListener(this);
renderer.setSurface(surface);
mCamera = Camera.open();
try
{
mCamera.setPreviewTexture(surface);
mCamera.startPreview();
}
catch (IOException ioe)
{
Log.w("MainActivity","CAM LAUNCH FAILED");
}
}
public void onFrameAvailable(SurfaceTexture surfaceTexture)
{
glSurfaceView.requestRender();
} …Run Code Online (Sandbox Code Playgroud) 我有一个开源iOS应用程序,它使用自定义OpenGL ES 2.0着色器来显示分子结构的三维表示.它通过使用在矩形上绘制的程序生成的球体和圆柱体冒充者来实现这一点,而不是使用大量顶点构建的这些相同形状.这种方法的缺点是这些冒名顶替对象的每个片段的深度值需要在片段着色器中计算,以便在对象重叠时使用.
不幸的是,OpenGL ES 2.0 不允许你写入gl_FragDepth,所以我需要将这些值输出到自定义深度纹理.我使用帧缓冲对象(FBO)对场景进行传递,仅渲染出与深度值对应的颜色,并将结果存储到纹理中.然后将此纹理加载到渲染过程的后半部分,在此过程中生成实际的屏幕图像.如果该阶段的片段处于存储在屏幕上该点的深度纹理中的深度级别,则显示该片段.如果没有,它就会被抛出.有关该过程的更多信息,包括图表,可以在我的帖子中找到.
这种深度纹理的生成是我渲染过程中的一个瓶颈,我正在寻找一种方法来加快它的速度.它似乎比它应该慢,但我无法弄清楚为什么.为了实现正确生成此深度纹理,GL_DEPTH_TEST禁用,GL_BLEND启用glBlendFunc(GL_ONE, GL_ONE),并glBlendEquation()设置为GL_MIN_EXT.我知道以这种方式输出的场景在基于图块的延迟渲染器上并不是最快的,比如iOS设备中的PowerVR系列,但我想不出更好的方法.
我对球体的深度片段着色器(最常见的显示元素)看起来是这个瓶颈的核心(仪器中的渲染器利用率固定在99%,表明我受片段处理的限制).目前看起来如下:
precision mediump float;
varying mediump vec2 impostorSpaceCoordinate;
varying mediump float normalizedDepth;
varying mediump float adjustedSphereRadius;
const vec3 stepValues = vec3(2.0, 1.0, 0.0);
const float scaleDownFactor = 1.0 / 255.0;
void main()
{
float distanceFromCenter = length(impostorSpaceCoordinate);
if (distanceFromCenter > 1.0)
{
gl_FragColor = vec4(1.0);
}
else
{
float calculatedDepth = sqrt(1.0 - distanceFromCenter * distanceFromCenter);
mediump float …Run Code Online (Sandbox Code Playgroud)