文件加载功能:
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
和着色器加载func调用
if (!CompileShader(&fragShader, GL_FRAGMENT_SHADER, fragShaderData->data))
{
LOGE("Failed to compile frgment shader", 0);
return 0;
}
最佳答案
文本文件与NUL字节终止的字符串不同。如果您精确分配文件大小并准确读取文件长度,则缓冲区末尾将没有(正确)终止NUL字节。这本身不是问题,因为可以将着色器源长度显式传递给glSourceString
。但是,如果您不这样做,glSourceString
将通过终止源字符串来期望NUL。
您的问题的解决方案:要么显式传递着色器源大小,要么在末尾附加一个NUL字节。
关于android - Android源码末尾没有为随机符号编译Frag着色器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42658025/