Мне не удалось устранить некорректное отображение цветов на объектах-шарах. (Обратите внимание: это проект - некоторая реализация может быть странной из-за ограничений). Меня устраивает положение вершин, но мне трудно передать какое-либо значение цвета во фрагментный шейдер.
Вот соответствующий код:
Измените, чтобы добавить полный пример кода
GLheader.h
/*
* This is to avoid linker errors that were occurring
*/
#pragma once
#define GLEW_STATIC 1 // This allows linking with Static Library on Windows, without DLL
#include // Include GLEW - OpenGL Extension Wrangler
#include
#include
#include "glm/ext.hpp" //to use string_cast
#include
#include "glm/gtx/string_cast.hpp" //glm::to_string()
#include
Основной цикл + цикл рендеринга:
#pragma once
#include "GLheader.h"
#include
#include //for PI
#include
#include
#include "Shader.h"
#include "Ball.h"
int scr_width = 1024;
int scr_height = 768;
std::string vs = "basic.vert", fs = "basic.frag";
std::string vs_test = "test.vert", fs_test = "test.frag";
void GLAPIENTRY
MessageCallback(GLenum source,
GLenum type,
GLuint id,
GLenum severity,
GLsizei length,
const GLchar* message,
const void* userParam)
{
fprintf(stderr, "GL CALLBACK: %s type = 0x%x, severity = 0x%x, message = %s\n",
(type == GL_DEBUG_TYPE_ERROR ? "** GL ERROR **" : ""),
type, severity, message);
}
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
glfwGetWindowSize(window, &scr_width, &scr_height);
}
void processInput(GLFWwindow* window)
{
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
glfwSetWindowShouldClose(window, true);
}
GLFWwindow* createWindow(void) {
glfwWindowHint(GLFW_DOUBLEBUFFER, GLFW_TRUE);
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwSwapInterval(1);
GLFWwindow* window = glfwCreateWindow(scr_width, scr_height, "test window", NULL, NULL);
if (!window) {
const char* msg = "GLFW Window object could not be initialised.";
throw msg;
}
return window;
}
void _initglew(void) {
glewExperimental = true;
if (glewInit() != GLEW_OK) {
const char* msg = "GLEW could not be initialised";
throw msg;
}
}
int main() {
if (!glfwInit()) {
fprintf(stderr, "GLFW could not be initialised");
return -1;
}
GLFWwindow* window;
Shader shader;
try {
window = createWindow();
glfwMakeContextCurrent(window);
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
_initglew();
Ball ball = Ball(FILLED);
glEnable(GL_DEBUG_OUTPUT);
glDebugMessageCallback(MessageCallback, 0);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
shader = Shader();
while (!glfwWindowShouldClose(window)) {
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
shader.use();
ball.draw();
glfwSwapBuffers(window);
glfwPollEvents();
}
}
catch (const char* msg) {
fprintf(stderr, msg);
return -1;
}
catch (const std::exception& e) {
fprintf(stderr, e.what());
return -1;
}
glfwTerminate();
return 0;
}
Объект «Шар»:
#include "Ball.h"
#include
#include
#include
#include
#include //for PI
#include
#include "GLheader.h"
bool isValidPixelPosition(float x, float y, float z);
bool isValidPixelPosition(float p);
Ball::Ball() : Ball(OUTLINE) {//colour(glm::uvec4(constants::BLACK,1.0f)), n_pixels(0), ID(ball::counter) {
}
Ball::Ball(DRAW_MODE mode) : colour(glm::vec4(0.0f)), n_pixels(0), ID(counter), draw_mode(mode) {
counter++;
std::vector pixel_positions = std::vector();
std::vector pixel_colors = std::vector();
std::vector transform = std::vector();
init();
}
Ball::~Ball() {
pixel_positions.clear();
pixel_colours.clear();
}
void Ball::init() {
randomize();
bool success = init_pixels();//this must be called before init VAO
if (!success) {
std::cout
Подробнее здесь: https://stackoverflow.com/questions/791 ... value-gl-i