OpenGL着色器编译错误Android 12三星Galaxy S21



我有以下顶点和片段着色器:

SimpleFragmentShader.fragmentshader:

#version 300 es
precision highp float;
out vec4 FragColor;
uniform vec4 vertexColor;
void main()
{
FragColor = vertexColor;
}

SimpleVertexShader.vertex着色器:

#version 300 es
layout (location = 0) in vec3 aPos;
uniform mat4 MVP;
void main()
{
gl_Position = MVP * vec4(aPos, 1.0);
}

用于加载着色器的函数:

GLuint LoadShaderProgram(const char* vertex_file_path,
const char* fragment_file_path) {
// Create the shaders
GLuint VertexShaderID = glCreateShader(GL_VERTEX_SHADER);
GLuint FragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER);
// Read the Vertex Shader code from the file
std::string VertexShaderCode;
std::ifstream VertexShaderStream(vertex_file_path, std::ios::in);
CHECK(VertexShaderStream.is_open())
<< "Unable to open shader at " << vertex_file_path;
std::string Line = "";
while (getline(VertexShaderStream, Line)) VertexShaderCode += "n" + Line;
VertexShaderStream.close();
// Read the Fragment Shader code from the file
std::string FragmentShaderCode;
std::ifstream FragmentShaderStream(fragment_file_path, std::ios::in);
if (FragmentShaderStream.is_open()) {
std::string Line = "";
while (getline(FragmentShaderStream, Line))
FragmentShaderCode += "n" + Line;
FragmentShaderStream.close();
}
GLint Result = GL_FALSE;
int InfoLogLength;
// Compile Vertex Shader
printf("Compiling shader : %sn", vertex_file_path);
char const* VertexSourcePointer = VertexShaderCode.c_str();
glShaderSource(VertexShaderID, 1, &VertexSourcePointer, NULL);
glCompileShader(VertexShaderID);
// Check Vertex Shader
glGetShaderiv(VertexShaderID, GL_COMPILE_STATUS, &Result);
glGetShaderiv(VertexShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength);
if (InfoLogLength > 0) {
std::vector<char> VertexShaderErrorMessage(InfoLogLength + 1);
glGetShaderInfoLog(VertexShaderID, InfoLogLength, NULL,
&VertexShaderErrorMessage[0]);
printf("%sn", &VertexShaderErrorMessage[0]);
}
// Compile Fragment Shader
printf("Compiling shader : %sn", fragment_file_path);
char const* FragmentSourcePointer = FragmentShaderCode.c_str();
glShaderSource(FragmentShaderID, 1, &FragmentSourcePointer, NULL);
glCompileShader(FragmentShaderID);
// Check Fragment Shader
glGetShaderiv(FragmentShaderID, GL_COMPILE_STATUS, &Result);
glGetShaderiv(FragmentShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength);
if (InfoLogLength > 0) {
std::vector<char> FragmentShaderErrorMessage(InfoLogLength + 1);
glGetShaderInfoLog(FragmentShaderID, InfoLogLength, NULL,
&FragmentShaderErrorMessage[0]);
printf("%sn", &FragmentShaderErrorMessage[0]);
}
// Link the program
printf("Linking programn");
GLuint ProgramID = glCreateProgram();
glAttachShader(ProgramID, VertexShaderID);
glAttachShader(ProgramID, FragmentShaderID);
glLinkProgram(ProgramID);
// Check the program
glGetProgramiv(ProgramID, GL_LINK_STATUS, &Result);
glGetProgramiv(ProgramID, GL_INFO_LOG_LENGTH, &InfoLogLength);
if (InfoLogLength > 0) {
std::vector<char> ProgramErrorMessage(InfoLogLength + 1);
glGetProgramInfoLog(ProgramID, InfoLogLength, NULL,
&ProgramErrorMessage[0]);
printf("%sn", &ProgramErrorMessage[0]);
}
glDeleteShader(VertexShaderID);
glDeleteShader(FragmentShaderID);
return ProgramID;
}

内部版本:targetSdkVersion 31,minSdkVersion 26

当我试图编译软件并在手机上运行时(三星Galaxy S21 5G、Exynos CPU、Mali-G78 GPU、Android 12(,我会收到以下错误:

D/native: Compiling shader : /data/user/0/app/files/shaders/SimpleVertexShader.vertexshader
D/native: 0:2: P0005: #version must be on the first line in a program and only whitespace are allowed in the declaration
Compiling shader
D/native:  : /data/user/0/app/files/shaders/SimpleFragmentShader.fragmentshader
D/native: 0:2: P0005: #version must be on the first line in a program and only whitespace are allowed in the declaration
Linking program
D/native: Link failed because of invalid vertex shader.

然而,当我试图在运行Android 12的三星Galaxy Tab S7(SM-T870,Snapdragon 865+(上运行相同的代码时,它是有效的。

错误消息暗示了语法错误,但我不认为这是问题所在,因为该软件在Galaxy Tab S7上编译良好。

我在三星Galaxy S21手机上尝试过不同版本(#version 100/200/300 es/310 es/320 es(,但代码仅在使用#version 100时编译。然而,ARM官方主页指出,Galaxy S21 Mali-G78 GPU应该支持所有这些版本。

是什么原因导致了这个问题?与Snapdragon相比,三星设备的Exynos版本是否有图形驱动程序缺乏OpenGL支持?我在使用Google或StackOverflow时没有发现相关问题。我在三星设备上发现的OpenGL和Android 12的唯一其他问题(这里和这里(涉及模拟器,而我的应用程序中并非如此。

谢谢你的帮助!

如注释中所述,代码。。。

std::string Line = "";
while (getline(VertexShaderStream, Line))
VertexShaderCode += "n" + Line;

在着色器源CCD_ 3的开头添加一个空行。因此,出现了有关版本说明符丢失或错位的错误消息。只需将代码更改为…

std::string Line = "";
while (getline(VertexShaderStream, Line))
VertexShaderCode += Line + "n";

并且对于片段着色器代码部分进行类似的操作。

最新更新