繁体   English   中英

使用OpenGL ES着色器进行Android测试

[英]Android test with OpenGL ES Shaders

我编写了一个测试类,只应该将应用程序图标绘制到屏幕上。 到目前为止没有运气。 我做错了什么?

public class GLTester
{


void test(final Context context)
{
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inScaled = false;
    bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.icon, options);

    setupGLES();
    createProgram();
    setupTexture();
    draw();
}


void draw()
{
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
    glUseProgram(glProgramHandle);

}
}

有几件事。

我认为你的squareVertices缓冲区应该包含4个vec3s。 但你的着色器是为vec4s设置的。 也许这没关系,但对我来说似乎很奇怪。

您也没有使用glFrustum或glOrtho设置任何类型的透视矩阵,也没有使用Matrix.setLookAtM等设置任何类型的视图矩阵。 您应该始终考虑保持顶点管道。 从本讲座看幻灯片2 https://wiki.engr.illinois.edu/download/attachments/195761441/3-D+Transformational+Geometry.pptx?version=2&modificationDate=1328223370000

我认为正在发生的事情是你的squareVertices正在通过这个管道并在另一侧作为像素坐标出现。 因此,您的图像可能是屏幕一角的非常小的图像,因为您使用的是从-1.0到1.0的顶点。

作为一个无耻的旁注,我在SourceForge上发布了一些代码,可以在资源文件夹中的文件中处理和加载着色器,而不必在.java文件中作为字符串进行处理。 https://sourceforge.net/projects/androidopengles/ Theres是一个使用此着色器助手的文件部分中的示例项目。

我希望这漫无边际的某些部分很有帮助。 :)

它看起来很不错,但我发现有一件事你在setupTexture中调用glUniform,而着色器不是当前绑定的。 你应该在调用glUseProgram后调用glUniform。

我不知道这是不是问题,因为我猜它可能默认为0,但我不确定。

除此之外,你应该熟悉调用glGetError来检查是否有任何错误条件未决。

此外,在创建着色器时,习惯用glGetShader(GL_COMPILE_STATUS)检查其成功状态,如果编译失败则检查glGetShaderInfoLog,对于具有glGetProgram / glGetProgramInfoLog的程序也类似。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM