【问题标题】:Android OpenGL ES 3.1 shader will not compileAndroid OpenGL ES 3.1 着色器无法编译
【发布时间】:2018-02-21 18:26:03
【问题描述】:

我无法在运行 Android 8.1.0 的 Pixel C 平板电脑上使用 OpenGL ES 3.1 编译这个空的计算着色器:

“shader.comp”

#version 310 es

void main()
{

}

我正在使用资产管理器从文件中读取此源,如下所示,我所有的 GL 调用都使用 Java 绑定而不是本机代码和 NDK:

String shaderSource;
AssetManager assets = context.getAssets();
InputStream shaderStream;
try
{
    shaderStream = assets.open("shader.comp");
} // catch etc...
shaderSource = shaderStream.toString();

// Compile source
int shaderObject = GLES31.glCreateShader(GLES31.GL_COMPUTE_SHADER);
GLES31.glShaderSource(shaderObject, shaderSource);
GLES31.glCompileShader(shaderObject);

// Get info about compilation
GLES31.glGetShaderiv(shaderObject, GLES31.GL_COMPILE_STATUS, status, 0);
if (status[0] != GLES31.GL_TRUE)
{
    Log.e("ComputeShader",
            "Compute Shader did not compile: " +
                    GLES31.glGetShaderInfoLog(shaderObject));
}

    // Link etc..

我得到的错误令人困惑:

Compute Shader did not compile: 0(1) : error C0000: syntax error, unexpected '.', expecting "::" at token "."

没有“。”在着色器源中。您认为这可能与输入流的.toString() 转换使用的编码有关吗? Android 上 OpenGL ES 的 Java 文档在很大程度上是不完整的,因此那里几乎没有帮助。此类错误还有其他潜在原因吗?

【问题讨论】:

  • 您确定您正在正确读取文件吗? InputStream.toString() 将获得该对象的 Object.toString() 而不是流的内容。见:stackoverflow.com/questions/16110002/read-assets-file-as-string
  • @MorrisonChang 谢谢你,我愚蠢地认为toString() 方法就像StringBuilder.toString() 方法一样,显然它是继承的方法。教训:检查文档。如果您想发布答案,我会接受。如果需要,您可以引用此答案:stackoverflow.com/questions/309424/… 以供参考。干杯。

标签: android opengl-es


【解决方案1】:

正如 Morrison Chang 所提到的,这里的问题是我试图用来将 InputStream 内容提取到 String.toString() 方法是从 java.lang.Object 继承的方法,而不是一些特定的实现。这里的教训是始终检查文档,而不是假设您知道方法的名称是如何实现的。

为了执行所需的操作,我将shaderSource = shaderStream.toString() 行替换为以下内容:

BufferedReader reader = new BufferedReader(new InputStreamReader(shaderStream, "UTF-8"));

// Read each line
String line;
StringBuilder contents = new StringBuilder();
while ((line = reader.readLine()) != null)
{
    // Add line to the file contents with a new line character at the end as they are stripped out by the readLine() method
    contents.append(line);
    contents.append('\n');
}
shaderSource = contents.toString();

StringBuilder.toString() 方法是我想要的覆盖。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-09
    • 2015-10-26
    相关资源
    最近更新 更多