我是一个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 m‌Length = 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;
	m‌Length = 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)
{
	m‌Length = 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出现了问题,但无论如何改都不行,所以如果有大佬能看出问题并告知我,我会隆重感谢他!

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐