c++ - Lectura de archivos de texto en un archivo dll
unity3d shader (1)
La puesta en marcha
Microsoft Visual Studio Professional 2015 , ejecutándose en Windows 10 Pro
Unidad 5.3.1f1 (x64)
El proyecto se basa en un proyecto de ejemplo proporcionado por Unity en su sitio. El proyecto se puede encontrar aquí.
Eso que hay que hacer
Estoy buscando crear un complemento opengl (en forma de dll) para usar con Unity. En su código de ejemplo, los sombreadores de vértices y fragmentos están codificados en el código de esta manera:
#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" /
No me gusta este enfoque y no necesito su flexibilidad. Así que quería poner cada shader en su propio archivo y cargar el archivo usando el siguiente fragmento de código.
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();
}
El problema
El resultado de mi proyecto es un archivo .dll y quería que mis dos sombreadores se incluyeran en ese archivo, donde podrían cargarse. Tal vez esto no sea posible, no lo sé.
He agregado los sombreadores al proyecto. También hice clic derecho en cada archivo y elegí Incluir en proyecto .
No sé dónde terminan los dos archivos. ¿Están incluidos en el archivo dll y, de ser así, qué ruta de acceso debo pasar a ShaderLoader::ReadShader
para leerlos?
Intenté averiguarlo utilizando GetModuleFileName
y FindFirstFile
pero no tuve éxito.
Entonces, en última instancia, la pregunta es: ¿es posible incluir archivos de texto en las bibliotecas dll compiladas con Visual Studio y, de ser así, cómo hacerlo?
Por supuesto, funcionará leer el archivo de la DLL, pero no usar su código. El problema aquí es que devuelve un puntero a los datos que desaparecerán cuando la función regrese.
La variable shaderCode
es una variable local dentro de la función ReadShader
, por lo que, por supuesto, será destruida una vez que la función regrese. Esa destrucción incluye liberar la memoria utilizada para la cadena contenida, por lo que el puntero que devuelve apunta a datos que ya no están asignados y tratar de usar esos datos dará lugar a un comportamiento indefinido .
En su lugar, devuelva el objeto std::string
real y obtenga el puntero cuando realmente lo necesite. Alternativamente (pero no es realmente algo que recomiendo) asigne memoria usted mismo y copie la cadena en la memoria, y devuelva un puntero a eso.