android - fragment 着色器未针对 Android 源代码末尾的随机符号进行编译

标签 android c++ opengl-es android-ndk shader

文件加载函数:

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/

相关文章:

c++ - 如何通过按 Escape 键重置 QLineEdit 文本?

c++ - 指向 C++ 中的结构的指针 - 从控制台读取?

c++ - 从函数指针输出动态数组

android - 适用于 iOS 和 Android 的 Xamarin Forms Syncfusion sfChart 自定义标签

android - 如何在没有 ViewPager 的情况下在水平 ScrollView 中获得分页功能

python - Chaquopy:从 python 代码读取文本文件时出错 "No such file or directory"

objective-c - 无法使用简单的立方体显示 VBO,似乎是缓冲区的问题

ios - 扭曲图像以在屏幕上产生雨滴效果

c++ - 如何计算帧缓冲区间距?

android - 绘制路线和海拔剖面图