我有一个使用以下代码制作的Shader.h文件:
#include <GL\GL.h>
#include <GL/freeglut.h>
#include <glm/glm.hpp>
#include <GL/glew.h>
in vec2 TexCoords;
out vec4 color;
uniform sampler2D text;
uniform vec3 textColor;
void main() {
vec4 sampled = vec4(1.0, 1.0, 1.0, texture(text, TexCoords).r);
color = vec4(textColor, 1.0) * sampled;
}
问题是我收到in vec2 TexCoords;
的错误消息,说“ in”是未定义的。我不确定这是否在库中以及如何在此头文件中正确使用它。我正在寻找一个教程来从LearnOpengl网站绘制文本:https://learnopengl.com/In-Practice/Text-Rendering
任何人都可以告诉我要使其正常工作需要包含哪些标题/库或我做错了什么
答案 0 :(得分:3)
这里有一些问题。
您正在混合使用C ++和GLSL
您缺少定义所使用的GLSL版本的行。 (GLSL的第一个版本不支持'in'关键字)。
texture()不是GLSL命令,您可能正在寻找texture2D?
您的着色器应如下所示:
// Use GLSL 4.5
#version 450
in vec2 TexCoords;
out vec4 color;
uniform sampler2D text;
uniform vec3 textColor;
void main() {
vec4 sampled = vec4(1.0, 1.0, 1.0, texture2D(text, TexCoords).r);
color = vec4(textColor, 1.0) * sampled;
}
另外,您需要编写C ++代码来定义几何形状,指定缓冲区并编译着色器。
答案 1 :(得分:0)
不是标题是问题。您那里的代码是用OpenGL编程语言(glsl)编写的。因此,为了将它们传递给您的着色器程序。该特定部分的代码应通过字符串传递到Shader.h文件。您想将片段着色器和顶点着色器的代码放在2个单独的文件中,然后通过字符串将其传递给着色器程序。然后,您可以从文件中直接将代码读取到着色器中。像这样:
ShadingProgram::ShadingProgram(std::string vp, std::string fp)
{
std::string shader;
GLuint shader_id;
const GLchar *source;
_program = glCreateProgram();
shader = GetShaderCode(vp);
shader_id = glCreateShader(GL_VERTEX_SHADER);
source = shader.c_str();
glShaderSource(shader_id, 1, &source, nullptr);
glCompileShader(shader_id);
CheckCompilation(shader_id, vp);
glAttachShader(_program, shader_id);
shader = GetShaderCode(fp);
shader_id = glCreateShader(GL_FRAGMENT_SHADER);
source = shader.c_str();
glShaderSource(shader_id, 1, &source, nullptr);
glCompileShader(shader_id);
CheckCompilation(shader_id, fp);
glAttachShader(_program, shader_id);
glLinkProgram(_program);
CheckLinking();
}
请注意,在learningopengl教程中,它们如何具有多个文件和完整的源代码供您查看。
或者,使用此示例将glsl代码作为字符串直接写入程序。