Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用OpenGL ES着色器的Android测试_Android_Opengl Es_Shader - Fatal编程技术网

使用OpenGL ES着色器的Android测试

使用OpenGL ES着色器的Android测试,android,opengl-es,shader,Android,Opengl Es,Shader,我已经编写了一个测试类,它应该只在屏幕上绘制应用程序图标。到目前为止没有运气。我做错了什么 public class GLTester { void test(final Context context) { BitmapFactory.Options options = new BitmapFactory.Options(); options.inScaled = false; bitmap = BitmapFactory.decodeResource(contex

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

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);

}
}

它看起来相当不错,但我看到一件事,您在setupTexture内部调用glUniform,而着色器不是当前绑定的。您应该只在调用GluseProgramm之后调用glUniform

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

除此之外,您应该熟悉调用glGetError来检查是否有任何等待处理的错误条件

此外,在创建着色器时,最好使用glGetShader(GL_COMPILE_status)检查它们的成功状态,如果编译失败,还可以使用glGetShaderInfoLog,对于使用glGetProgram/glGetProgramInfoLog的程序也是如此

有几件事

我想你的缓冲区应该包含4个向量。但是你的着色器是为vec4s设置的。也许这没关系,但我觉得很奇怪

您也没有使用glFrustum或glOrtho设置任何类型的透视矩阵,也没有使用类似matrix.setLookAtM的东西设置任何类型的查看矩阵。您还应该始终记住顶点管道。请看本课的幻灯片2

我认为现在发生的是,你的正方形顶点通过这个管道,在另一边以像素坐标的形式出现。因此,您的图像可能是屏幕角落中的一个非常小的规格,因为您使用的是从-1.0到1.0的顶点

作为一个无耻的旁白,我在SourceForge上发布了一些代码,这些代码使您能够处理和加载assets文件夹中的文件中的着色器,而不必在.java文件中作为字符串执行。 “文件”部分中有一个使用此着色器辅助对象的示例项目


我希望这段漫无边际的谈话能有所帮助。:)

我做了你的推荐,我在每次通话中都放上了glGetError。我在GLES20.glEnable(GLES20.GL_纹理_2D)下得到了一个错误1280;经过一些研究,我发现这个调用对于着色器和GLE是不必要的。我还删除了glUniform并添加了代码来检查着色器和程序编译状态。但到目前为止运气不好,我看不到屏幕上绘制的位图。应该很容易发现问题,但我正在努力找出问题所在