标签: opengl-es

OpenGL扩展可在不同的Android设备上使用

我正在为我的下一个Android游戏编写一个OpenGL ES驱动的框架.目前我支持三种绘制精灵的不同技巧:

  • 基本方法:使用顶点数组(慢)
  • 使用顶点缓冲对象(VBO)(更快)
  • 使用draw_texture扩展(最快,但仅适用于基本精灵,即无转换)

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,所以我可以接下来分享这些扩展.

java android opengl-es

48
推荐指数
6
解决办法
3万
查看次数

什么是'精密媒体浮动'是什么意思?

learnwebgl tutorial1中,我在片段着色器中发现了一条有趣的行.

precision mediump float;
Run Code Online (Sandbox Code Playgroud)

我在这里发现了一篇关于它的文章,但我仍然无法理解这是什么意思?

如果我删除这一行,没有任何变化.一切都是一样的.那precision mediump float意味着什么?

javascript terminology opengl-es webgl fragment-shader

48
推荐指数
1
解决办法
3万
查看次数

如何使用GPUImageLibrary"减去"滤色器?

目前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)

java android opengl-es gpuimage

46
推荐指数
1
解决办法
696
查看次数

为什么FloatBuffer而不是float []?

我一直在我的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背后的想法是什么?

java android opengl-es

44
推荐指数
2
解决办法
2万
查看次数

Android设备上的OpenGL ES 2.0扩展

作为OpenGL ES 1.x的此页面,我在此页面上收集了针对Android设备的OpenGL ES 2.x扩展.可以使用我的基准工具gpubench找到列表.这些信息可以帮助许多游戏开发者.

谢谢你的帮助,

android opengl-es android-ndk

43
推荐指数
3
解决办法
3万
查看次数

OpenGL与OpenGL ES 2.0 - OpenGL应用程序可以轻松移植吗?

我正在开发各种游戏框架,并且是OpenGL的新手.大多数书籍似乎都没有对这个问题给出非常明确的答案,我希望使用OpenGL在我的桌面上进行开发,但是在OpenGL ES 2.0环境中执行代码.我的问题是双重的:

  1. 如果我在桌面上定位我的OpenGL框架,它是否会在OpenGL ES 2.0环境中运行而无需修改?
  2. 如果没有,那么那里有一个好的模拟器,PC或Mac; 是否有一个我可以运行的脚本,它将我的OpenGL代码转换为OpenGL ES代码,或标记不起作用的东西?

opengl opengl-es emulation opengl-to-opengles

42
推荐指数
1
解决办法
3万
查看次数

用于GLSL编辑的工具

我正在寻找一种与GLSL一起使用的工具.我想在WebGL应用程序中试验着色器,所以我正在寻找的东西就像RenderMonkey.据我所知 - RenderMonkey不再受支持,因此必须有一些其他工具才能占据它的位置.

如果我能像RM一样完成"效果组合"和原始GLSL代码开发,那将是最好的.

ide opengl-es glsl webgl

42
推荐指数
6
解决办法
3万
查看次数

如何在OpenGL ES 2.0中获得"Glow"着色器效果?

我正在为iOS编写3D应用程序.我是OpenGL ES 2.0的新手,所以我还在自己编写基本的着色器.我真的需要根据纹理对我的一些模型实现"辉光"效果.

这是一个示例:

Bloom/Glow来自www.skillmanmedia.com/realbasic/bloomsnapshot.jpg .

我正在寻找OpenGL ES 2.0的代码示例.我在互联网上找到的大多数代码都是桌面OpenGL或D3D.

有任何想法吗?

shader opengl-es glsl ios opengl-es-2.0

40
推荐指数
2
解决办法
4万
查看次数

使用SurfaceTexture和OpenGL修改相机输出

我试图通过openGL过滤器运行来自相机硬件的流,然后在GLSurfaceView中显示它.当openGL去渲染帧时,LogCat会反复发出错误:

[unnamed-3314-0] updateTexImage:清除GL错误:0x502

0x502是一个通用的openGL错误,并没有真正帮助我追踪问题.这是一个代码如何工作的序列(或者至少应该像我脑中看到的那样工作),并且我已经将代码复制到了下面.我希望别人能看出我的问题是什么.

  1. 创建新的MyGLSurfaceView.这也在内部创建了新的MyGL20Renderer对象.此MyGLSurfaceView设置为内容视图.
  2. 一旦MyGLSurfaceView完成膨胀/初始化,此完成事件将触发渲染器创建DirectVideo绘图对象,该对象编译/链接定义的着色器并将它们添加到openGL程序.然后它创建一个新的openGL纹理对象,然后使用纹理对象ID回调MainActivity.
  3. 从渲染器调用MainActivity方法时,它会使用传递的openGL纹理对象创建一个新的SurfaceTexture对象.然后它将自己设置为表面的onFrameListener.然后创建/打开相机对象,将创建的SurfaceTexture设置为视频流的目标,然后启动相机源.
  4. 当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)

android opengl-es opengl-es-2.0

40
推荐指数
1
解决办法
3万
查看次数

如何提高自定义OpenGL ES 2.0深度纹理生成的性能?

我有一个开源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)

iphone opengl-es glsl ipad ios

39
推荐指数
3
解决办法
1万
查看次数