繁体   English   中英

Android OpenGL ES 3.1着色器无法编译

[英]Android OpenGL ES 3.1 shader will not compile

我无法在运行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文档基本上不完整,因此那里几乎没有帮助。 此类错误是否还有其他潜在原因?

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

为了执行所需的操作,我用以下shaderSource = shaderStream.toString()替换了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()方法是我想要的替代。

暂无
暂无

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

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