![](/img/trans.png)
[英]Light with vertex/fragment shader. Using varying variables. (openGL)
[英]OpenGL cant send variables from vertex shader to fragment shader
我對 OpenGL 還很陌生,剛開始使用具有頂點着色器和片段着色器的基本程序。 一切正常,直到我嘗試將數據從頂點着色器發送到片段着色器。 我在網上閱讀了代碼並且做得很完美。 我在頂點着色器和片段着色器中都用完了,我在網上到處尋找解決方案,但找不到任何東西,而且當您對 GLSL 或 OpenGL 不太了解時,很難進行調試。 這是着色器。 (我只發布着色器,因為其他一切都正常工作。頂點
#version 120
varying vec4 ourColor;
attribute vec3 position;
void main()
{
gl_Position = vec4(position, 1.0);
ourColor = vec4(1.0,0.1,0.2,0.5);
}
和片段:
#version 120
varying vec4 ourColor;
void main()
{
gl_FragColor = ourColor;
}
錯誤是:片段着色器包含一個用戶變量,但鏈接時沒有頂點着色器。 我嘗試使用 flat 關鍵字和不同的關鍵字,結果相同。 並提前感謝您的時間。 我也試過更改版本,然后使用 in 和 out,同樣的錯誤。 這是着色器代碼:(它在着色器類中,這是 Shader.cpp)
Shader::Shader(const std::string & fileName)
{
m_program = glCreateProgram();
//vertex shader
m_shaders[0] = CreateShader(LoadShader(fileName + ".vs"), GL_VERTEX_SHADER);
m_shaders[0] = CreateShader(LoadShader(fileName + ".fs"),
GL_FRAGMENT_SHADER);
for(unsigned int i = 0; i < NUM_SHADERS; i++)
glAttachShader(m_program, m_shaders[i]);
glBindAttribLocation(m_program, 0, "position");
glLinkProgram(m_program);
CheckShaderError(m_program, GL_LINK_STATUS, true, "Error: Program linking failed. ");
glValidateProgram(m_program);
CheckShaderError(m_program, GL_VALIDATE_STATUS, true, "Error: Program is invalid. ");
}
//-----------
Shader::~Shader(void)
{
for(unsigned int i = 0; i < NUM_SHADERS; i++)
{
glDetachShader(m_program, m_shaders[i]);
glDeleteShader(m_shaders[i]);
}
glDeleteProgram(m_program);
}
//----------
void Shader::Bind()
{
glUseProgram(m_program);
}
static GLuint CreateShader(const std::string & text, GLenum shaderType)
{
GLuint shader = glCreateShader(shaderType);
if(shader == 0)
{
std::cerr << "Error: Shader creation failed! " << std::endl;
}
const GLchar* ShaderSourceStrings[1];
GLint ShaderSourceStringsLengths[1];
ShaderSourceStrings[0] = text.c_str();
ShaderSourceStringsLengths[0] = text.length();
glShaderSource(shader, 1, ShaderSourceStrings, ShaderSourceStringsLengths);
glCompileShader(shader);
CheckShaderError(shader, GL_COMPILE_STATUS, false, "Error: Shader compilation failed");
return shader;
}
//-----------
static std::string LoadShader(const std::string & fileName)
{
std::ifstream file;
file.open((fileName).c_str());
std::string output;
std::string line;
if(file.is_open())
{
while(file.good())
{
getline(file, line);
output.append(line + "\n");
}
}
else
{
std::cerr << "unable to load shader file: " << fileName << std::endl;
}
return output;
}
//-----------
static void CheckShaderError(GLuint shader, GLuint flag, bool isProgram, const std::string & errorMessage)
{
GLint success = 0;
GLchar error[1024] = {0};
if(isProgram)
glGetProgramiv(shader, flag, &success);
else
glGetShaderiv(shader, flag, &success);
if(success == GL_FALSE)
{
if(isProgram){
glGetProgramInfoLog(shader, sizeof(error), NULL, error);
std::cout << "error from program" << std::endl;
}
else{
glGetShaderInfoLog(shader, sizeof(error), NULL, error);
std::cout << "error from shader" << std::endl;
}
std::cerr << errorMessage << ": '" << error << "'" << std::endl;
}
}
最終更新:
這是錯誤。
m_shaders[0] =
m_shaders[0] =
片段着色器包含一個用戶變量,但在沒有頂點着色器的情況下鏈接。
沒有頂點着色器鏈接? 那肯定會引起問題。 該代碼看起來應該依稀是這樣的:
GLuint load_shader(GLenum shader_type, ...) {
GLuint shader = glCreateShader(shader_type);
... load shader source code ...
glCompileShader(shader);
GLint success;
glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
if (!success) {
// boom
}
... glGetShaderInfoLog ...
return shader;
}
GLuint load_program(...) {
GLuint prog = glCreateProgram();
// Attach both fragment and vertex shader
glAttachShader(prog, load_shader(GL_VERTEX_SHADER, ...));
glAttachShader(prog, load_shader(GL_FRAGMENT_SHADER, ...));
// Then link them together
glLinkProgram(prog);
GLint success;
glGetProgramiv(program, GL_LINK_STATUS, &success);
if (!success) {
// boom
}
... glGetProgramInfoLog ...
}
這是相當多的樣板代碼,並且代碼有很多機會包含錯誤,因此出錯是很常見的,尤其是因為實際上 OpenGL 中的所有內容都只是typedef int GLxxx;
或類似的東西。
在 GLSL 120 中, in
和out
不是存儲限定符。 改用varying
。
// Same in vertex and fragment shader.
varying vec4 ourColor;
或者,使用較新的 GLSL 版本。
#version 330
out vec4 ourColor;
in vec3 position;
#version 330
in vec4 ourColor;
out vec4 fragColor;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.