Glsl 逐顶点灯光着色器
我正在尝试编译这个glsl着色器,但看起来好像有什么问题,因为他失败了。这是错误消息_loggaves me:在调用glLinkProgram()之前未成功编译顶点着色器。链接失败 它是逐顶点灯光着色器:Glsl 逐顶点灯光着色器,glsl,shader,Glsl,Shader,我正在尝试编译这个glsl着色器,但看起来好像有什么问题,因为他失败了。这是错误消息_loggaves me:在调用glLinkProgram()之前未成功编译顶点着色器。链接失败 它是逐顶点灯光着色器: vec4 ambient() { vec4 ambient = vec4 (0.0); ambient = gl_FrontMaterial.ambient * gl_LightSource[0].ambient; ambient +
vec4 ambient()
{
vec4 ambient = vec4 (0.0);
ambient = gl_FrontMaterial.ambient * gl_LightSource[0].ambient;
ambient += (gl_LightModel.ambient * gl_FrontMaterial.ambient);
return ambient;
}
vec4 diffuse(vec3 normal)
{
vec3 diffuse = gl_LightSource[0].position * normal;
float diff = max(dot(normal,diffuse),0.0);
diffuse = gl_LightSource[0].diffuse * gl_FrontMaterial.diffuse * diff;
return diffuse;
}
vec4 specular(vec3 normal)
{
float hv = max(dot(normal, vec3(gl_LightSource[0].halfVector)), 0.0);
float spec = pow(hv, gl_FrontMaterial.shininess);
return gl_LightSource[0].specular * gl_FrontMaterial.specular * spec;
}
void main()
{
vec3 normal = normalize(gl_NormalMatrix * gl_Normal);
vec4 ambient = ambient();
vec4 diffuse = diffuse(normal);
vec4 specular = specular(normal);
gl_FrontColor = gl_Color*(ambient+difuse)+specular;
gl_Position = ftransform();
}
vec4 ambient()
{
vec4 ambient = vec4 (0.0);
ambient = gl_FrontMaterial.ambient * gl_LightSource[0].ambient;
ambient += (gl_LightModel.ambient * gl_FrontMaterial.ambient);
return ambient;
}
vec4 diffuse(vec3 normal)
{
vec4 diffuse=(0,0);
vec3 lightDir = normalize(vec3(gl_LightSource[0].position));
float diff = max(dot(normal, lightDir), 0.0);
diffuse = gl_LightSource[0].diffuse * gl_FrontMaterial.diffuse * diff;
return diffuse;
}
vec4 specular(vec3 normal)
{
float hv = max(dot(normal, vec3(gl_LightSource[0].halfVector.xyz)), 0.0);
float spec = pow(hv, gl_FrontMaterial.shininess);
return gl_LightSource[0].specular * gl_FrontMaterial.specular * spec;
}
void main()
{
vec3 normal = normalize(gl_NormalMatrix * gl_Normal);
vec4 ambient = ambient();
vec4 diffuse = diffuse(normal);
vec4 specular = specular(normal);
gl_FrontColor = ambient + diffuse + specular;
gl_Position = ftransform();
}
这是着色器类:
#include "Shader.h"
namespace topicos
{
#include "Shader.h"
Shader::Shader()
{
program = glCreateProgram();
}
Shader::~Shader()
{
glDetachShader(program, vertexShader);
glDetachShader(program, geometryShader);
glDetachShader(program, fragmentShader);
glDeleteShader(vertexShader);
glDeleteShader(geometryShader);
glDeleteShader(fragmentShader);
glDeleteProgram(program);
}
void Shader::determinarFontes(std::string vertex, std::string geometry, std::string fragment)
{
vertexFileName = vertex;
geometryFileName = geometry;
fragmentFileName = fragment;
}
void Shader::ativarShader()
{
glLinkProgram(program);
glUseProgram(program);
programLog(program);
shaderLog(program);
std::cout<<_log;
}
void Shader::desativarShader()
{
glUseProgram(0);
}
void Shader::shaderLog(unsigned int obj)
{
int infologLength = 0;
int charsWritten = 0;
char *infoLog;
glGetShaderiv(obj, GL_INFO_LOG_LENGTH, &infologLength);
if (infologLength > 0)
{
infoLog = new char[infologLength];
glGetShaderInfoLog(obj, infologLength, &charsWritten, infoLog);
std::string str(infoLog);
if (!str.empty())
{
_log += "\n" + str;
}
else
{
_log += "Done.\n";
}
delete [] infoLog;
}
}
void Shader::programLog(unsigned int obj)
{
int infologLength = 0;
int charsWritten = 0;
char *infoLog;
glGetProgramiv(obj, GL_INFO_LOG_LENGTH, &infologLength);
if (infologLength > 0)
{
infoLog = new char[infologLength];
glGetProgramInfoLog(obj, infologLength, &charsWritten, infoLog);
std::string str(infoLog);
if (!str.empty())
{
_log += "\n" + str;
}
else
{
_log += "Done.\n";
}
delete [] infoLog;
}
}
std::string Shader::loadShader(std::string shaderFile)
{
std::string texto = "";
std::ifstream obj;
obj.open(shaderFile.c_str(), std::ifstream::in);
// std::cout << " ..>> " << obj.is_open() << std::endl;
std::string linha;
while(std::getline(obj, linha))
{
texto += linha + "\n";
}
obj.close();
//std::cout<<"texto: " << texto<< std::endl;
return texto;
}
void Shader::makeVertexShader(const std::string& vertexFileName)
{
/**This function creates a vertex shader,
compiles it and attached to the program**/
const char *stringConvertidaVertex = loadShader(vertexFileName).c_str();
//std::cout<<"vertex shader: " << loadShader(vertexFileName)<<std::endl;
vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, &stringConvertidaVertex, NULL);
glCompileShader(vertexShader);
glAttachShader(program, vertexShader);
}
void Shader::makeFragmentShader(const std::string& fragmentFileName)
{
/**This function creates a fragment shader,
compiles it and attached to the program**/
const char *stringConvertidaFragment = loadShader(fragmentFileName).c_str();
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &stringConvertidaFragment, NULL);
glCompileShader(fragmentShader);
glAttachShader(program, fragmentShader);
}
void Shader::makeGeometryShader(const std::string& geometryFileName)
{
/**This function creates a fragment shader,
compiles it and attached to the program**/
const char *stringConvertidaGeometry = loadShader(geometryFileName).c_str();
geometryShader = glCreateShader(GL_GEOMETRY_SHADER);
glShaderSource(geometryShader, 1, &stringConvertidaGeometry, NULL);
glCompileShader(geometryShader);
glAttachShader(program, geometryShader);
}
}
#包括“Shader.h”
名称空间topicos
{
#包括“Shader.h”
着色器::着色器()
{
program=glCreateProgram();
}
着色器::~Shader()
{
glDetachShader(程序、顶点着色器);
GLS(程序、几何阴影);
glDetachShader(程序、碎片着色器);
glDeleteShader(顶点着色器);
glDeleteShader(几何阴影);
glDeleteShader(fragmentShader);
glDeleteProgram(program);
}
void着色器::determinarFontes(std::字符串顶点,std::字符串几何体,std::字符串片段)
{
vertexFileName=顶点;
geometryFileName=几何体;
fragmentFileName=片段;
}
void着色器::ativarShader()
{
glLinkProgram(program);
glUseProgram(程序);
程序日志(程序);
shaderLog(程序);
标准::cout(0)
{
infoLog=新字符[infologLength];
glGetProgramInfoLog(obj、infologLength和CharsWrited、infoLog);
std::字符串str(infoLog);
如果(!str.empty())
{
_log+=“\n”+str;
}
其他的
{
_日志+=“完成。\n”;
}
删除[]信息日志;
}
}
std::string Shader::loadShader(std::string shaderFile)
{
std::string texto=“”;
std::ifstreamobj;
open(shaderFile.c_str(),std::ifstream::in);
//std::cout缺少版本号、尺寸不匹配和打字错误。
(我对自己的编码风格保持评论。)
附录
glslangValidator从
具有上述代码的foo.vert
glslangValidator foo.vert
echo $?
0
我想
gl_FrontColor = gl_Color*(ambient+difuse)+specular;
应该是
gl_FrontColor = gl_Color*(ambient+diffuse)+specular;
要让驱动程序显示这些错误,以便您不必自己查找它们,请执行此操作(使用C语言,我不确定您使用的是哪种主机语言)
//检查着色器的编译是否成功。
//成功时,返回GL_TRUE。失败时,打印
//向stderr发送错误消息并返回GL_FALSE。
闪烁检查\u着色器\u编译\u状态(GLuint着色器)
{
GLchar*信息日志;
闪烁r;
glGetShaderiv(着色器、GL\u编译状态和&r);
如果(r==GL_FALSE)
{
glGetShaderiv(着色器、GL\u INFO\u LOG\u LENGTH和r);
info_log=malloc(sizeof(GLchar)*r);
glGetShaderInfoLog(着色器,r,NULL,信息日志);
fprintf(标准,“%s”,信息日志);
免费(信息日志);
返回GL_FALSE;
}
返回GL_TRUE;
已解决
这是正确的逐顶点灯光着色器:
vec4 ambient()
{
vec4 ambient = vec4 (0.0);
ambient = gl_FrontMaterial.ambient * gl_LightSource[0].ambient;
ambient += (gl_LightModel.ambient * gl_FrontMaterial.ambient);
return ambient;
}
vec4 diffuse(vec3 normal)
{
vec3 diffuse = gl_LightSource[0].position * normal;
float diff = max(dot(normal,diffuse),0.0);
diffuse = gl_LightSource[0].diffuse * gl_FrontMaterial.diffuse * diff;
return diffuse;
}
vec4 specular(vec3 normal)
{
float hv = max(dot(normal, vec3(gl_LightSource[0].halfVector)), 0.0);
float spec = pow(hv, gl_FrontMaterial.shininess);
return gl_LightSource[0].specular * gl_FrontMaterial.specular * spec;
}
void main()
{
vec3 normal = normalize(gl_NormalMatrix * gl_Normal);
vec4 ambient = ambient();
vec4 diffuse = diffuse(normal);
vec4 specular = specular(normal);
gl_FrontColor = gl_Color*(ambient+difuse)+specular;
gl_Position = ftransform();
}
vec4 ambient()
{
vec4 ambient = vec4 (0.0);
ambient = gl_FrontMaterial.ambient * gl_LightSource[0].ambient;
ambient += (gl_LightModel.ambient * gl_FrontMaterial.ambient);
return ambient;
}
vec4 diffuse(vec3 normal)
{
vec4 diffuse=(0,0);
vec3 lightDir = normalize(vec3(gl_LightSource[0].position));
float diff = max(dot(normal, lightDir), 0.0);
diffuse = gl_LightSource[0].diffuse * gl_FrontMaterial.diffuse * diff;
return diffuse;
}
vec4 specular(vec3 normal)
{
float hv = max(dot(normal, vec3(gl_LightSource[0].halfVector.xyz)), 0.0);
float spec = pow(hv, gl_FrontMaterial.shininess);
return gl_LightSource[0].specular * gl_FrontMaterial.specular * spec;
}
void main()
{
vec3 normal = normalize(gl_NormalMatrix * gl_Normal);
vec4 ambient = ambient();
vec4 diffuse = diffuse(normal);
vec4 specular = specular(normal);
gl_FrontColor = ambient + diffuse + specular;
gl_Position = ftransform();
}
能否在问题中包含完整的编译错误消息?在glLinkProgram()之前,顶点着色器未成功编译调用了。链接失败。您可能会发现最近的答案很有用。谢谢您的答案,但仍然没有编译。是的,它有;请参阅上面的附录。此编译器与我的编译器有什么区别?在我的代码块项目中,项目没有编译。您希望修复顶点着色器错误,而不是“项目”当然,我测试了另一个着色器,它是有效的。我不想知道错误是什么。你到底打算什么时候向我们展示世界解谜、大统一理论、魔法信息?只是要求确保我穿着合适的衣服参加那个活动。读这些东西怎么样?我有e已写入消息:“在调用glLinkProgram()之前,顶点着色器未成功编译。链接失败。”这不是来自glGetShaderInfoLog的消息。此消息“0:13(52):错误:算术运算符0:16(10)的向量大小不匹配:错误:无法将vec4类型的值分配给vec3 0:17(16)类型的变量:错误:函数漫反射中返回的“returning vec4[…]”来自glGetShaderInfoLog,返回的“vec3类型错误”。此“顶点着色器在调用glLinkProgram()之前未成功编译。链接失败。”不是