Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从文件加载后,顶点着色器和片段着色器都不会编译_C++_Opengl_Glsl - Fatal编程技术网

C++ 从文件加载后,顶点着色器和片段着色器都不会编译

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

我是OpenGL新手,我试图编写一个着色器类,从文件加载着色器并编译它们。问题是,它们都没有编译。两者都显示如下错误消息:

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);

};