文件加载功能:

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/

10-14 10:18