Bjo*_*inn 5 c++ dll shader unity-game-engine
Microsoft Visual Studio Professional 2015,在Windows 10 Pro
Unity 5.3.1f1 (x64) 上运行
该项目基于 Unity 在其网站上提供的示例项目。该项目可以在这里找到。
我正在研究创建一个用于 Unity 的 opengl 插件(以 dll 的形式)。在他们的示例代码中,顶点和片段着色器在代码中被硬编码,如下所示:
#define VPROG_SRC(ver, attr, varying) \
ver \
attr " highp vec3 pos;\n" \
attr " lowp vec4 color;\n" \
"\n" \
varying " lowp vec4 ocolor;\n" \
"\n" \
"uniform highp mat4 worldMatrix;\n" \
"uniform highp mat4 projMatrix;\n" \
"\n" \
"void main()\n" \
"{\n" \
" gl_Position = (projMatrix * worldMatrix) * vec4(pos,1);\n" \
" ocolor = color;\n" \
"}\n" \
Run Code Online (Sandbox Code Playgroud)
我不喜欢这种方法,我不需要它的灵活性。所以我想把每个着色器放在他们自己的文件中,并使用以下代码加载文件。
const char* ShaderLoader::ReadShader(char *filename)
{
std::string shaderCode;
std::ifstream file(filename, std::ios::in);
if (!file.good())
{
std::cout << "Can't read file " << filename << std::endl;
return nullptr;
}
file.seekg(0, std::ios::end);
shaderCode.resize((unsigned int)file.tellg());
file.seekg(0, std::ios::beg);
file.read(&shaderCode[0], shaderCode.size());
file.close();
return shaderCode.c_str();
}
Run Code Online (Sandbox Code Playgroud)
我的项目的输出是一个.dll文件,我希望我的两个着色器包含在该文件中,以便加载它们。也许这是不可能的,我不知道。
我已将着色器添加到项目中。我还右键单击了每个文件并选择了Include In Project。
我不知道这两个文件的最终位置。它们是否包含在dll文件中,如果是,我需要通过什么路径ShaderLoader::ReadShader来读取它们?
我试图通过使用来解决这个问题GetModuleFileName,FindFirstFile但没有成功。
所以最终的问题是:是否可以在使用 Visual Studio 构建的 dll 库中包含文本文件,如果可以,我该怎么做?
当然,可以从 DLL 读取文件,但不能使用您的代码。这里的问题是,您返回一个指向数据的指针,该指针在函数返回时将消失。
该变量shaderCode是函数内部的局部变量ReadShader,因此一旦函数返回,它当然会被破坏。该破坏包括释放用于所包含字符串的内存,因此您返回的指针指向不再分配的数据,并且尝试使用该数据将导致未定义的行为。
相反,返回实际std::string对象并在实际需要时获取指针。或者(但不是我真正推荐的)自己分配内存并将字符串复制到内存中,然后返回指向该字符串的指针。
| 归档时间: |
|
| 查看次数: |
2099 次 |
| 最近记录: |