C++问OpenGL图形渲染不出求解
·
我是一个OpenGl新手,在visualstudio2022中写一个名为NGGraphicalFrameWork的代码项目中遇
到了一些图形渲染问题:在窗口中渲染一个点(大小30.0f),结果没有任何的显示;
请问有没有一些大佬帮忙.
这是我的代码
main.cpp:
#include"codes/NGGraphicalFramework.h"
int main()
{
Init();
Window* window = new MainWindow();
double time = glfwGetTime();
double i = 0.1f;
while (window->Update(i))
{
i = glfwGetTime() - time;
time = glfwGetTime();
}
Terminate();
return 0;
}
NGGraphicalFrameWork.h:
#pragma once
#include"../application/core.h"
#include"../application/general.h"
#include"../application/window.h"
#include"../codes/mainWindow.h"
mainWindow.h:
#pragma once
#include"NGGraphicalFramework.h"
class Rectangle;
class MainWindow : public Window
{
public:
MainWindow();
~MainWindow();
void Render(double time);
protected:
Rectangle* a = nullptr;
private:
};
mainWindow.cpp:
#include"NGGraphicalFramework.h"
#include"../application/rectangle.h"
MainWindow::MainWindow()
{
SetClearColor(BLACK);
a = new Rectangle(this,0.0f,0.0f,-1.0f,-1.0f);
}
void MainWindow::Render(double time)
{
Clear();
a->Rander();
}
MainWindow::~MainWindow()
{
if (GetWindow() == nullptr)
glfwDestroyWindow(GetWindow());
}
window.h:
#pragma once
#include"mouseLog.h"
class Window;
struct GLFWwindow;
using ResizeCallBack = void(*)(GLFWwindow* window,int width, int height);
#define BLACK 0.0f,0.0f,0.0f,1.0f
#define WRITE 1.0f,1.0f,1.0f,1.0f
#define RAD 1.0f,0.0f,0.0f,1.0f
#define GREEN 0.0f,1.0f,0.0f,1.0f
#define BLUE 0.0f,0.0f,1.0f,1.0f
void Init(int major, int minor, int value); //版本初始化
void Init(); //默认版本初始化,默认版本4.6,非立即渲染模式
void SetClearColor(float r, float a, float b, float w); //设置清屏颜色
bool Load(Window* window); //加载函数
void Terminate(); //退出处理
void Clear();
class Window
{
public:
Window(); //初始化:分别输入:宽度,高度,窗体标题名字
~Window(); //销毁
void Bind(); //绑定
void MouseNote(MOUSE_BUTTON button, ACTION log,MOD mod);
GLFWwindow* GetWindow(); //获取窗口
int Getwidth();
int GetHeight();
const char* GetTitle();
MouseLog GetMouseLog();
KeyLog GetKeyLog();
void SetWindowSize(int width, int height);
void SetWindowTitle(const char* name);
virtual bool Update(double time); //更新
virtual void Render(double time); //渲染
public:
static void S_FramebufferSizeCallback(GLFWwindow* window,int width, int height);
void ResizeCallBack(int width, int height);
static void S_MouseButtonCallback(GLFWwindow* window, int button, int action, int mods);
void MouseButtonCallback(int button, int action, int mods);
static void S_KeyCallback(GLFWwindow* window, int key, int scancode, int action, int mods);
void KeyCallback(int key, int scancode, int action, int mods);
private:
GLFWwindow* mWindow; //窗体
int mWidth{800}; //宽度
int mHeight{600}; //高度
const char* mTitle{"window"}; //窗体标题名字
MouseLog mMouseLog;
KeyLog mKeyLog;
static Window* nowWindow;
};
window.cpp:
#include"window.h"
#include"core.h"
Window* Window::nowWindow = nullptr;
void Init(int major,int minor,int value)
{
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, major); //设置主版本号
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, minor); //设置次版本号
glfwWindowHint(GLFW_OPENGL_PROFILE, value); //设置模式
}
void Init()
{
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 6);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); //版本4.6,非立即渲染模式
}
void SetClearColor(float r,float a,float b,float w)
{
glClearColor(r,a,b,w); //设置渲染颜色
}
bool Load(Window* window)
{
glfwMakeContextCurrent(window->GetWindow());
return gladLoadGLLoader((GLADloadproc)glfwGetProcAddress);
}
void Terminate()
{
glfwTerminate();
}
void Clear()
{
glClear(GL_COLOR_BUFFER_BIT);
}
Window::Window()
{
nowWindow = this;
mWindow = glfwCreateWindow(mWidth, mHeight, mTitle, nullptr, nullptr);//创建窗体
Load(this);
glfwSetFramebufferSizeCallback(mWindow, S_FramebufferSizeCallback);
glfwSetMouseButtonCallback(mWindow, S_MouseButtonCallback);
glfwSetKeyCallback(mWindow, S_KeyCallback);
}
Window::~Window()
{
if (mWindow == nullptr)
glfwDestroyWindow(mWindow); //销毁窗体
}
void Window::Bind()
{
double x, y;
glfwGetCursorPos(mWindow, &x, &y);
mMouseLog = { NO_MOUSE_BUTTON , 0 ,0,x,y };
mKeyLog.mKey = NOKEY;
mKeyLog.mScancode = NOKEY;
mKeyLog.mAction = RELEASE;
mKeyLog.mMod = NOMOD;
nowWindow = this;
glViewport(0, 0, mWidth, mHeight);
glfwMakeContextCurrent(mWindow); //绑定渲染窗口
Clear();//清屏
glfwPollEvents(); //分发事件
glfwSwapBuffers(mWindow);
}
void Window::MouseNote(MOUSE_BUTTON button, ACTION log, MOD mod)
{
mMouseLog.mButton = button;
mMouseLog.mLog = log;
mMouseLog.mMod = mod;
double x, y;
glfwGetCursorPos(mWindow, &x, &y);
mMouseLog = { button , log ,mod,x,y };
}
GLFWwindow* Window::GetWindow()
{
return mWindow;
}
int Window::Getwidth()
{
return mWidth;
}
int Window::GetHeight()
{
return mHeight;
}
const char* Window::GetTitle()
{
return mTitle;
}
MouseLog Window::GetMouseLog()
{
return mMouseLog;
}
KeyLog Window::GetKeyLog()
{
return mKeyLog;
}
void Window::SetWindowSize(int width, int height)
{
mWidth = width;
mHeight = height;
glfwSetWindowSize(mWindow, width, height);
}
void Window::SetWindowTitle(const char* name)
{
glfwSetWindowTitle(mWindow, name);
}
bool Window::Update(double time)
{
if (glfwWindowShouldClose(mWindow))
{
return false;
}
Bind();
Render(time);
return true;
}
void Window::Render(double time)
{
}
void Window::S_FramebufferSizeCallback(GLFWwindow* window, int width, int height)
{
if(nowWindow->mWindow == window)
nowWindow->ResizeCallBack(width,height);
}
void Window::ResizeCallBack(int width, int height)
{
mWidth = width;
mHeight = height;
}
void Window::S_MouseButtonCallback(GLFWwindow* window, int button, int action, int mods)
{
if (nowWindow->mWindow == window)
nowWindow->MouseButtonCallback(button, action, mods);
}
void Window::MouseButtonCallback(int button, int action, int mods)
{
MouseNote(button, action, mods);
}
void Window::S_KeyCallback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
if (nowWindow->mWindow == window)
nowWindow->KeyCallback(key,scancode,action, mods);
}
void Window::KeyCallback(int key, int scancode, int action, int mods)
{
mKeyLog.mKey = key;
mKeyLog.mScancode = scancode;
mKeyLog.mAction = action;
mKeyLog.mMod = mods;
}
rectangle.h:
#pragma once
class Window;
typedef unsigned int uint;
class Rectangle
{
public:
Rectangle(Window* window);
Rectangle(Window* window, float xpos, float ypos,float length, float width);
~Rectangle();
void Rander();
void PreparePosition();
void SetPosition(float xpos,float ypos);
void SetSize(float length, float width);
protected:
Window* mWindow;
float mColorR = 0.0f, mColorG = 1.0f , mColorB = 1.0f ,mColorW = 1.0f;
float mPosX = 0.0f, mPosY = 0.0f;
float mLength = 1.0f, mWidth = 1.0f;
float* mPointPosition = nullptr;
float* mColor = nullptr;
uint mVboPos = 0, mVboColor = 0;
uint mVao = 0; //0:位置,1:颜色,2:uv
uint mveo = 0;
uint program = 0;
};
rectangle.cpp:
#include"rectangle.h"
#include"core.h"
#include"window.h"
#include<iostream>
Rectangle::Rectangle(Window* window)
{
mWindow = window;
PreparePosition();
}
Rectangle::Rectangle(Window* window, float xpos, float ypos, float length, float width)
{
mWindow = window;
mPosX = xpos;
mPosY = ypos;
mLength = length;
mWidth = width;
PreparePosition();
}
Rectangle::~Rectangle()
{
if (mPointPosition != nullptr)
delete[] mPointPosition;
if (mVboPos != 0)
glDeleteBuffers(1, &mVboPos);
if (mVao != 0)
glDeleteVertexArrays(1, &mVao);
}
void Rectangle::Rander()
{
glUseProgram(program);
glPointSize(30.f);
glDrawArrays(GL_POINTS, 0, 1);
}
void Rectangle::PreparePosition()
{
const char* vertexShaderSource =
"#version 330 core\n"
"void main()\n"
"{\n"
" gl_Position = vec4(0.0f,0.0f,0.0f,1.0f);\n"
"}\0";
const char* fragmentShaderSource =
"#version 330 core\n"
"out vec4 color;\n"
"void main()\n"
"{\n"
" color = vec4(0.0f,0.0f,1.0f,1.0f);\n"
"}\0";
GLuint vertex, fragment;
vertex = glCreateShader(GL_VERTEX_SHADER);
fragment = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(vertex, 1, &vertexShaderSource, NULL);
glShaderSource(fragment, 1, &fragmentShaderSource, NULL);
glCompileShader(vertex);
int success;
glGetShaderiv(vertex, GL_COMPILE_STATUS, &success);
glCompileShader(fragment);
glGetShaderiv(fragment, GL_COMPILE_STATUS, &success);
program = glCreateProgram();
glAttachShader(program, vertex);
glAttachShader(program, fragment);
glLinkProgram(program);
glGetProgramiv(program, GL_LINK_STATUS, &success);
glDeleteShader(vertex);
glDeleteShader(fragment);
glGenVertexArrays(1, &mVao);
glBindVertexArray(mVao);
}
void Rectangle::SetPosition(float xpos, float ypos)
{
mPosX = xpos;
mPosY = ypos;
PreparePosition();
}
void Rectangle::SetSize(float length, float width)
{
mLength = length;
mWidth = width;
PreparePosition();
}
mouseLog.h:
#pragma once
#define MOUSE_BUTTON int
#define ACTION int
#define MOD int
#define NOMOD 0X0000
#define NO_MOUSE_BUTTON 0X0003
#define LEFT_MOUSE_BUTTON 0X0000
#define RIGHT_MOUSE_BUTTON 0X0001
#define MIDDLE_MOUSE_BUTTON 0X0002
#define RELEASE 0X0000
#define PRESS 0X0001
#define KEY int
#define SCANCODE int
#define SHIFT 0X0001
#define CTRL 0X0002
#define SHIFT_CTRL 0X0003
#define ALT 0X0004
#define SHIFT_ALT 0X0005
#define CTRL_ALT 0X0006
#define SHIFT_CTRL_ALT 0X0007
#define WIN 0X0008
#define SHIFT_WIN 0X0009
#define CTRL_WIN 0X000A
#define SHIFT_CTRL_WIN 0X000B
#define ALT_WIN 0X000C
#define SHIFT_ALT_WIN 0X000D
#define CTRL_ALT_WIN 0X000E
#define SHIFT_CTRL_ALT_WIN 0X000F
#define NOKEY 0X0000
#define KEY_A 0X0041
#define KEY_B 0X0042
#define KEY_C 0X0043
#define KEY_D 0X0044
#define KEY_E 0X0045
#define KEY_F 0X0046
#define KEY_G 0X0047
#define KEY_H 0X0048
#define KEY_I 0X0049
#define KEY_J 0X004A
#define KEY_K 0X004B
#define KEY_L 0X004C
#define KEY_M 0X004D
#define KEY_N 0X004E
#define KEY_O 0X004F
#define KEY_P 0X0050
#define KEY_Q 0X0051
#define KEY_R 0X0052
#define KEY_S 0X0053
#define KEY_T 0X0054
#define KEY_U 0X0055
#define KEY_V 0X0056
#define KEY_W 0X0057
#define KEY_X 0X0058
#define KEY_Y 0X0059
#define KEY_Z 0X005A
#define KEY_ESC 0X0100
#define KEY_F1 0X0122
#define KEY_F2 0X0123
#define KEY_F3 0X0124
#define KEY_F4 0X0125
#define KEY_F5 0X0126
#define KEY_F6 0X0127
#define KEY_F7 0X0128
#define KEY_F8 0X0129
#define KEY_F9 0X012A
#define KEY_F10 0X012B
#define KEY_F11 0X012C
#define KEY_F12 0X012D
#define KEY_TILDE 0X0060
#define KEY_0 0X0030
#define KEY_1 0X0031
#define KEY_2 0X0032
#define KEY_3 0X0033
#define KEY_4 0X0034
#define KEY_5 0X0035
#define KEY_6 0X0036
#define KEY_7 0X0037
#define KEY_8 0X0038
#define KEY_9 0X0039
#define KEY_MINUSSIGN 0X002D
#define KEY_EQUALSIGN 0X003D
#define KEY_BACKSPACE 0X0103
#define KEY_TAB 0X0102
#define KEY_SQUAREBRACKET 0X005B
#define KEY_ANTIBRACKET 0X005D
#define KEY_BACKSLASH 0X005C
#define KEY_CAPSLOCK 0X0118
#define KEY_SEMICOLON 0X003B
#define KEY_SINGLEQUOTATIONMARK 0X0027
#define KEY_ENTER 0X0101
#define KEY_LEFT_SHIFT 0X0154
#define KEY_COMMA 0X002C
#define KEY_PERIOD 0X002E
#define KEY_FORWARDSLASH 0X002F
#define KEY_RIGHT_SHIFT 0X0158
#define KEY_LEFT_CTRL 0X0155
#define KEY_LEFT_WIN 0X0157
#define KEY_LEFT_ALT 0X0156
#define KEY_SPACE 0X0020
#define KEY_RIGHT_ALT 0X015A
#define KEY_RIGHT_WIN 0X015B
#define KEY_APPLICATIONKEY 0X015C
#define KEY_RIGHT_CTRL 0X0159
#define KEY_UP 0X0109
#define KEY_DOWN 0X0108
#define KEY_LEFT 0X0107
#define KEY_RIGHT 0X0106
#define KEY_PRINTSCREEN 0X011B
#define KEY_SCROLLLOCK 0X0119
#define KEY_PAUSEBREAK 0X011C
#define KEY_INSERT 0X0104
#define KEY_HOME 0X010C
#define KEY_PAGEUP 0X010A
#define KEY_DELETE 0X0105
#define KEY_END 0X010D
#define KEY_PAGEDOWN 0X010B
#define KEY_NUMPAD_NUMLOCK 0X011A
#define KEY_NUMPAD_FORWARDSLASH 0X014B
#define KEY_NUMPAD_ASTERISK 0X014C
#define KEY_NUMPAD_MINUSSIGN 0X014D
#define KEY_NUMPAD_PLUS 0X014E
#define KEY_NUMPAD_ENTER 0X014F
#define KEY_NUMPAD_DEL 0X014A
#define KEY_NUMPAD_0 0X0140
#define KEY_NUMPAD_1 0X0141
#define KEY_NUMPAD_2 0X0142
#define KEY_NUMPAD_3 0X0143
#define KEY_NUMPAD_4 0X0144
#define KEY_NUMPAD_5 0X0145
#define KEY_NUMPAD_6 0X0146
#define KEY_NUMPAD_7 0X0147
#define KEY_NUMPAD_8 0X0148
#define KEY_NUMPAD_9 0X0149
struct MouseLog
{
MOUSE_BUTTON mButton{ NO_MOUSE_BUTTON };
ACTION mLog{ RELEASE };
MOD mMod{ NOMOD };
double mX{ 0.0 };
double mY{ 0.0 };
};
struct KeyLog
{
KEY mKey{ NOKEY };
SCANCODE mScancode{0};
ACTION mAction{ RELEASE };
MOD mMod{ NOMOD };
};
core.h:
#include"../include/glad/glad.h"
#include"../include/GLFW/glfw3.h"
general.h:
#pragma once
bool IsValidPointer(void* ptr);
general.cpp:
#include"general.h"
bool IsValidPointer(void* ptr)
{
return ptr != nullptr;
}
这就是我以上的代码,我认为主要是上面的Rectangle出现了问题,但无论如何改都不行,所以如果有大佬能看出问题并告知我,我会隆重感谢他!
更多推荐


所有评论(0)