从 .glsl 文件中读取 OpenGL 着色器语言
Reading OpenGL Shader Language from .glsl File
我正在尝试从文件中读取着色器字符串;但是,我在函数行glShaderSource()
遇到了问题。如您所知,glShaderSource()
需要const char**
,我必须声明char *
才能从文件中读取。因此,我正在使用强制转换来转换类型。
如果我使用 const_cast<const char **>
,则会出现形状;但是,它的颜色错误(应该是橙色而不是白色)。如果我使用 reinterpret_cast<const char**>
,我在运行时出现Access violation reading location 0x73726576
错误。
那么,我该如何解决这个问题呢?谢谢!
平台:Windows 7,Visual Studio 2010
代码行:
文件: shader.glsl
#version 330
in vec3 vp;
void main() {
gl_Position = vec4( vp, 1.0);
}
主():
/* FILE READING */
FILE* shaderFile = fopen( "shader.glsl ", "r");
int fileSize = 0;
char* vertex_shader = NULL;
//Getting File Size
fseek( shaderFile, 0, SEEK_END );
fileSize = ftell( shaderFile );
rewind( shaderFile );
//Reading From File
vertex_shader = (char*)malloc( sizeof( char) * (fileSize+1) );
fread( vertex_shader, sizeof( char ), fileSize, shaderFile );
vertex_shader[ fileSize] = ' ';
fclose( shaderFile );
//Shader definition - If I used this format, it works.
/*const char* vertex_shader = "#version 330n"
"in vec3 vp;"
"void main(){"
"gl_Position = vec4( vp, 1.0);"
"}";*/
//If I use const char* vertex_shader above, it appears orange.
const char* fragment_shader = "#version 330n"
"out vec4 frag_colour;"
"void main () {"
" frag_colour = vec4(0.7, 0.4, 0.2, 1.0);"
"}";
//Shader compiling
unsigned int vertexShader = glCreateShader( GL_VERTEX_SHADER );
//The shape appears but not orange
glShaderSource( vertexShader, 1, const_cast<const char **>(&vertex_shader) , NULL );
//glShaderSource( vertexShader, 1, reinterpret_cast<const char**>(vertex_shader) , NULL ); //Gives error
glCompileShader( vertexShader );
unsigned int fragmentShader = glCreateShader( GL_FRAGMENT_SHADER );
glShaderSource( fragmentShader, 1, &fragment_shader, NULL);
glCompileShader( fragmentShader );
//Shader program
unsigned int shaderProgram = glCreateProgram();
glAttachShader( shaderProgram, fragmentShader );
glAttachShader( shaderProgram, vertexShader );
glLinkProgram( shaderProgram );
//Drawing
while( !glfwWindowShouldClose( window ) )
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glUseProgram( shaderProgram );
glBindVertexArray( vao );
glDrawArrays( GL_TRIANGLES, 0, 3);
glfwPollEvents();
glfwSwapBuffers( window);
}
将数组的地址传递给函数:
glShaderSource( vertexShader, 1, (const GLchar**)&vertex_shader, NULL);
编辑:
感谢您更新问题中的代码。如果您的程序编译,没有崩溃,但着色器仍然不起作用,那么是时候调查 GLSL 编译器是否返回任何错误了!每次调用 glCompileShader()
后,编写类似以下内容的内容以显示编译期间发生的任何问题:
// This checks for errors upon compiling the Vertex Shader
GLint _compiled = 0;
glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &_compiled);
if (!_compiled)
{
GLint length;
GLchar* log;
glGetShaderiv(vertexShader, GL_INFO_LOG_LENGTH, &length);
log = new GLchar[length];
glGetShaderInfoLog(vertexShader, length, &length, log);
std::cerr << "!!! Compile log = " << log << std::endl;
delete log;
return;
}
shaderSource
函数需要char **
所以拿起你的char *
,只使用&
运算符,而不是试图仅仅强制转换它。
相关文章:
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 了解 GLM- openGL 中的相机转换
- 如何在全屏模式下(在OpenGL中)使背景透明
- 为什么我不能使用 EGL 创建无头 OpenGl 上下文?
- OpenGL大的3D纹理(>2GB)非常慢
- OpenGl glm rotate
- C++atioglxx.pdb未加载错误glBufferData OpenGL
- OpenGL在启用深度测试时不会丢弃我的碎片
- OpenGL相机和相机空间转型的困惑
- 不同语言中相同代码的不同行为
- OpenGL将纹理四边形渲染为(0,0)
- OpenGL 和 GLM 矩阵无法正确扩展,总是按比例缩小
- 发布旋转矩阵(openGL/glm)
- 如何在Visual Basic中使用矩形函数OpenGL绘制矩形
- 无法使用VAO和EBO(openGL)绘制多个对象
- 为跨平台OpenGL ES 2.0+引擎选择语言和设计 - iOS & Android
- 从 .glsl 文件中读取 OpenGL 着色器语言
- OpenGL 着色器语言初始化错误无法从 GLChar 转换为 const
- 在窗口标题和消息框中显示错误的语言:win32应用程序,opengl
- 第一个例子在OpenGL 4.0着色语言的食谱