C++ 从文件加载后,顶点着色器和片段着色器都不会编译
我是OpenGL新手,我试图编写一个着色器类,从文件加载着色器并编译它们。问题是,它们都没有编译。两者都显示如下错误消息:C++ 从文件加载后,顶点着色器和片段着色器都不会编译,c++,opengl,glsl,C++,Opengl,Glsl,我是OpenGL新手,我试图编写一个着色器类,从文件加载着色器并编译它们。问题是,它们都没有编译。两者都显示如下错误消息: 0:1(1): error: syntax error, unexpected $end 我在这里搜索了很多同样的问题,但是没有一个有效。代码如下: 着色器.h #ifndef SHADER_H #define SHADER_H #include <GL/glew.h> #include <string> #include <fstrea
0:1(1): error: syntax error, unexpected $end
我在这里搜索了很多同样的问题,但是没有一个有效。代码如下:
着色器.h
#ifndef SHADER_H
#define SHADER_H
#include <GL/glew.h>
#include <string>
#include <fstream>
#include <sstream>
#include <iostream>
class Shader {
public:
Shader(const GLchar* path);
GLint Compile(GLenum type);
GLuint GetID() const;
const char* GetShaderCode() const;
void InfoLog() const;
private:
GLuint shaderId;
const char* shaderCode;
int shaderCodeLength;
char log[512];
};
#endif
shader.frag
#version 130
in vec3 Color;
in vec2 Texcoord;
out vec4 outColor;
uniform sampler2D texKitten;
uniform sampler2D texPuppy;
void main() {
outColor = mix(texture(texKitten, Texcoord), texture(texPuppy, Texcoord), 0.5);
};
很多人都说问题在于着色器源最终有点像这样:
\version 130in vec3 Color代码>(但当我在主代码上打印时,它的打印方式与文件上的打印方式相同),许多人都说这是从文件加载着色器的正确方式。那么,这样做有什么不对呢?有更好的方法吗?shaderCode
在构造函数返回后立即无效,因为您正在保存shaderString.c_str()的结果。
使用它是未定义的
使用std::string
成员,仅在编译着色器或使用动态分配时进行转换。
第一个选项更好。shaderCode
在构造函数返回后立即无效,因为您正在保存shaderString.c_str()的结果。
使用它是未定义的
使用std::string
成员,仅在编译着色器或使用动态分配时进行转换。
第一个选项更好。哇,终于找到了一个不错的解决方案!我知道shaderString.c_str()的问题,但我不认为这里是这样。无论如何,非常感谢!哇,终于找到了一个不错的解决方案!我知道shaderString.c_str()的问题,但我不认为这里是这样。无论如何,非常感谢!您可以在构造函数中使用glShaderSource
。这样,您就不需要本地副本,您可以使用glGetShaderSource
@BrettHale查询它,因为问题是glShaderSource和shaderString.c_str()不在同一范围内。也谢谢。您可以在构造函数中使用glShaderSource
。这样,您就不需要本地副本,您可以使用glGetShaderSource
@BrettHale查询它,因为问题是glShaderSource和shaderString.c_str()不在同一范围内。也谢谢你。
#version 130
in vec2 position;
in vec3 color;
in vec2 texcoord;
out vec3 Color;
out vec2 Texcoord;
uniform mat4 trans;
void main() {
Color = color;
Texcoord = texcoord;
gl_Position = trans * vec4(position, 0.0, 1.0);
}
#version 130
in vec3 Color;
in vec2 Texcoord;
out vec4 outColor;
uniform sampler2D texKitten;
uniform sampler2D texPuppy;
void main() {
outColor = mix(texture(texKitten, Texcoord), texture(texPuppy, Texcoord), 0.5);
};