-1
コンパイル時にシェーダがエラーをスローしていますが、エラーログは返されません。どんな考え?頂点シェーダのコンパイルエラー、エラーなし
#version 430
layout(location = 0) in vec3 vertex_position;
layout(location = 1) in vec2 vertex_texcoord;
layout(location = 2) in vec3 vertex_pos;
layout(location = 3) in vec3 vertex_rot;
layout(location = 4) in vec3 vertex_scl;
layout(location = 5) in int vertex_texnum;
varying vec2 texcoord;
varying float tex_num;
uniform float aspect_ratio;
mat4 view_frustum(
float angle_of_view,
float aspect_ratio,
float z_near,
float z_far
) {
return mat4(
vec4(1.0/tan(angle_of_view), 0.0, 0.0, 0.0),
vec4(0.0, aspect_ratio/tan(angle_of_view), 0.0, 0.0),
vec4(0.0, 0.0, (z_far+z_near)/(z_far-z_near), -2.0*z_far*z_near/(z_far-z_near)),
vec4(0.0, 0.0, 1.0, 0.0)
);
}
mat4 scale(float x, float y, float z)
{
return mat4(
vec4(x, 0.0, 0.0, 0.0),
vec4(0.0, y, 0.0, 0.0),
vec4(0.0, 0.0, z, 0.0),
vec4(0.0, 0.0, 0.0, 1.0)
);
}
mat4 translate(float x, float y, float z)
{
return mat4(
vec4(1.0, 0.0, 0.0, 0.0),
vec4(0.0, 1.0, 0.0, 0.0),
vec4(0.0, 0.0, 1.0, 0.0),
vec4(x, y, z, 1.0)
);
}
mat4 rotate_x(float theta)
{
return mat4(
vec4(1.0, 0.0, 0.0, 0.0),
vec4(0.0, cos(theta), sin(theta), 0.0),
vec4(0.0, -sin(theta), cos(theta), 0.0),
vec4(0.0, 0.0, 0.0, 1.0)
);
}
mat4 rotate_y(float theta)
{
return mat4(
vec4(cos(theta), 0.0, sin(theta), 0.0),
vec4( 0.0, 1.0, 0.0, 0.0),
vec4(-sin(theta), 0.0, cos(theta), 0.0),
vec4( 0.0, 0.0, 0.0, 1.0)
);
}
mat4 rotate_z(float theta)
{
return mat4(
vec4(cos(theta), -sin(theta), 0.0, 0.0),
vec4(sin(theta), cos(theta), 0.0, 0.0),
vec4( 0.0, 0.0, 1.0, 0.0),
vec4( 0.0, 0.0, 0.0, 1.0)
);
}
mat4 frustum = view_frustum(radians(45.0), 1, 0.5, 50.0);
mat4 translation = translate(vertex_pos.x, vertex_pos.y, vertex_pos.z);
mat4 rotation = rotate_x(vertex_rot.x) * rotate_y(vertex_rot.y) * rotate_z(vertex_rot.z);
mat4 scale = scale(vertex_scl.x, vertex_scl.y, vertex_scl.z);
void main() {
gl_Position = frustum * (rotation * (scale * (translation * vec4(vertex_position, 1.0))));
texcoord = vertex_texcoord;
tex_num = vertex_texnum;
}
EDIT:わかりやすい質問に対する私の謝罪、私は睡眠不足だった。 マイシェーダローディングコードはここにある:私にとって
void initShaders(GLuint& shader_program) {
std::ifstream file;
std::string line;
file.open("data/shaders/VertexShader.glsl", std::ios::in);
if(!file.is_open()) Error("Failed to open Vertex Shader file.");
std::string vs_str = "";
int i = 0;
while(getline(file,line)) {
vs_str += line + "\n";
++i;
}
std::string fs_str = "";
file.close();
file.open("data/shaders/FragmentShader.glsl", std::ios::in);
if(!file.is_open()) Error("Failed to open Fragment Shader file.");
i = 0;
while(getline(file,line)) {
fs_str += line + "\n";
++i;
}
const char* vertex_shader = &vs_str[0];
const char* fragment_shader = &fs_str[0];
file.close();
GLuint vs = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vs, 1, &vertex_shader, NULL);
glCompileShader(vs);
GLuint fs = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fs, 1, &fragment_shader, NULL);
glCompileShader(fs);
GLint isCompiled = 0;
glGetShaderiv(vs, GL_COMPILE_STATUS, &isCompiled);
if(isCompiled == GL_FALSE)
{
GLint maxLength = 0;
glGetShaderiv(vs, GL_INFO_LOG_LENGTH, &maxLength);
// The maxLength includes the NULL character
std::vector<GLchar> errorLog(maxLength);
glGetShaderInfoLog(vs, maxLength, &maxLength, &errorLog[0]);
std::cout << "VERTEX SHADER ERROR:\n";
for (std::vector<GLchar>::iterator i = errorLog.begin(); i != errorLog.end(); ++i)
{
std::cout << *i;
}
std::cout << "\n";
glDeleteShader(vs); // Don't leak the shader.
quit(EXIT_FAILURE);
}
isCompiled = 0;
glGetShaderiv(fs, GL_COMPILE_STATUS, &isCompiled);
if(isCompiled == GL_FALSE)
{
GLint maxLength = 0;
glGetShaderiv(fs, GL_INFO_LOG_LENGTH, &maxLength);
// The maxLength includes the NULL character
std::vector<GLchar> errorLog(maxLength);
glGetShaderInfoLog(fs, maxLength, &maxLength, &errorLog[0]);
std::cout << "FRAGMENT SHADER ERROR:\n";
for (std::vector<GLchar>::iterator i = errorLog.begin(); i != errorLog.end(); ++i)
{
std::cout << *i;
}
std::cout << "\n";
glDeleteShader(fs); // Don't leak the shader.
quit(EXIT_FAILURE);
}
shader_program = glCreateProgram();
glAttachShader(shader_program, fs);
glAttachShader(shader_program, vs);
glLinkProgram(shader_program);
glUseProgram(shader_program);
}
"エラーログを返さない*エラーロギングコードが間違っていますか?もちろん、それを見ることなく話す方法はありません。 –