文件加载函数:
std::string path = std::string(fileLink.path)
+ std::string(fileLink.name)
+ std::string(".")
+ std::string(fileLink.type);
AAsset* asset = AAssetManager_open(AndroidWrapper::Get()->GetAssetMgr(), path.c_str(), AASSET_MODE_UNKNOWN);
long size = AAsset_getLength(asset);
char* data = (char*) malloc( sizeof(char) * size + 1);
AAsset_read(asset, data, size);
AAsset_close(asset);
DATA* fileData = new DATA;
fileData->data = data;
fileData->size = size;
return fileData;
有时着色器加载正常,但大多数情况下它在最后加载随机符号,例如
I/ExampleApp: Shader code: varying lowp vec4 colorVarying;
void main()
{
gl_FragColor = colorVarying;
}
de
和着色器加载函数调用
if (!CompileShader(&fragShader, GL_FRAGMENT_SHADER, fragShaderData->data))
{
LOGE("Failed to compile frgment shader", 0);
return 0;
}
最佳答案
文本文件与以 NUL 字节结尾的字符串不同。如果您为 精确 分配文件大小并精确读取文件长度,则缓冲区末尾将没有(正确的)终止 NUL 字节。这本身不是问题,因为您可以将着色器源长度显式传递给 glSourceString
。但是,如果您不这样做,glSourceString
会通过终止源字符串期望 NUL。
您的问题的解决方案:显式传递着色器源大小或在末尾附加一个 NUL 字节。
关于android - fragment 着色器未针对 Android 源代码末尾的随机符号进行编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42658025/