Saya mencoba mendefinisikan konstruktor untuk kelas saya ShaderProgram
yang mengambil dua argumen input, keduanya bertipe Shader
yang merupakan kelas lain yang telah saya tetapkan. Namun, saya mendapatkan kesalahan "Tidak ada konstruktor default untuk kelas", yang bagi saya sepertinya C++ sedang mencoba membuat dua objek shader, padahal saya sebenarnya hanya memberi tahu C++ tipe apa yang dimiliki argumen input saya. Saya sangat baru mengenal C++ jadi ini mungkin hanya kesalahpahaman yang bodoh. Ini implementasi saya:
ShaderProgram.cpp
#include "ShaderProgram.h"
ShaderProgram::ShaderProgram(Shader vertex_shader, Shader fragment_shader) // Somehow error here
{
vertex_shader_ = vertex_shader;
fragment_shader_ = fragment_shader;
id_ = glCreateProgram();
glAttachShader(id_, vertex_shader_.GetId());
glAttachShader(id_, fragment_shader_.GetId());
glLinkProgram(id_);
int success;
char info_log[512];
glGetProgramiv(id_, GL_LINK_STATUS, &success);
if (!success) {
glGetProgramInfoLog(id_, 512, NULL, info_log);
logger.Error("Failed to link program using vertex shader at '" + vertex_shader_.GetFilepath() +
"' and fragment shader at '" + fragment_shader_.GetFilepath() + "'");
logger.Error(info_log);
} else
{
logger.Debug("Successfully linked program");
}
}
ShaderProgram.h
#include <glad/glad.h>
#include "Shader.h"
#pragma once
class ShaderProgram
{
private:
unsigned int id_;
Shader vertex_shader_;
Shader fragment_shader_;
Logger logger = Logger("Shader Program Logger");
public:
ShaderProgram(Shader vertex_shader, Shader fragment_shader);
};
Shader.cpp
#include "Shader.h"
Shader::Shader(std::string filepath, int type)
{
filepath_ = filepath;
id_ = glCreateShader(GL_VERTEX_SHADER);
source_ = ReadShaderFile(filepath);
c_source_ = source_.c_str();
glShaderSource(id_, 1, &c_source_, NULL);
glCompileShader(id_);
int success;
char info_log[512];
glGetShaderiv(id_, GL_COMPILE_STATUS, &success);
if (!success) {
glGetShaderInfoLog(id_, 512, NULL, info_log);
logger.Error("Failed to compile shader '" + filepath_ + "'");
logger.Error(info_log);
}
else {
logger.Debug("Successfully compiled shader '" + filepath_ + "'");
}
}
unsigned int Shader::GetId()
{
return id_;
}
std::string Shader::GetFilepath()
{
return filepath_;
}
std::string Shader::ReadShaderFile(std::string filepath)
{
std::ifstream file(filepath.c_str());
std::stringstream string_buffer;
string_buffer << file.rdbuf();
file.close();
std::string content = string_buffer.str() + '\0';
return content;
}
Shader.h
#include <string>
#include <fstream>
#include <sstream>
#include <glad/glad.h>
#include <iostream>
#include "../Logger.h"
#pragma once
class Shader
{
private:
int type_;
unsigned int id_;
std::string source_;
const char* c_source_;
std::string filepath_;
Logger logger = Logger("Shader Logger");
public:
private:
std::string ReadShaderFile(std::string filepath);
public:
Shader(std::string filepath, int type);
unsigned int GetId();
std::string GetFilepath();
};
vertex_shader_
danfragment_shader_
Anda di konstruktorShaderProgram
… Ada duplikat untuk ditautkan ke suatu tempat. - person ChrisMM   schedule 03.06.2020ShaderProgram.h
. Terima kasih! - person Zorobay   schedule 03.06.2020