OpenGL显示空白的白屏
OpenGL Showing Blank White Screen
我正在尝试将OpenGL函数抽象成自己的类。Vertexbuffer和IndexBuffer类工作。但是在尝试抽象Vertexarray类之后。它不起作用,我似乎无法锻炼什么问题。我正在提供3个文件主应用程序,缓冲类别文件和Vertexarray类文件。我遗漏了一些功能和一个文件,我认为这不是必要的
我尝试使用VS-2019调试。我在VS-2017中创建了这个项目,但已升级。直到glEnableVertexAttribArray
都可以使用的所有内容,我已经检查了_ELEM的值,它们看起来正确。但是我看不到三角形。但是,当我尝试在原始功能中执行此操作时,它起作用
main.cpp:
#include "Buffer.h"
#include "VertexArray.h"
int main(void)
{
GLFWwindow* window;
/* Initialize the library */
if (!glfwInit())
return -1;
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GL_TRUE);
/* Create a windowed mode window and its OpenGL context */
window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);
if (!window)
{
glfwTerminate();
return -1;
}
/* Make the window's context current */
glfwMakeContextCurrent(window);
if (glewInit() != GLEW_OK)
{
glfwTerminate();
return -1;
}
glEnable(GL_DEBUG_CALLBACK_FUNCTION);
glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
glDebugMessageCallback(GLErrLogger, nullptr);
{
float pos[] = {
0.0f, 0.5f,
0.5f, -0.5f,
-0.5f, -0.5f
};
unsigned int indices[] = {
0, 1, 2
};
// Some Shader stuff
VertexBuffer vb(_BufferDataParams(pos));
BufferLayout bLayout;
bLayout.Push<GL_FLOAT, sizeof(GLfloat)>(2);
//RefID va;
//glGenVertexArrays(1, &va);
//vb.BindSelf();
//glBindVertexArray(va);
VertexArray va(vb, bLayout);
//glEnableVertexAttribArray(0);
//glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), 0);
IndexBuffer ib(_BufferDataParams(indices));
glUseProgram(shader);
GLint location = glGetUniformLocation(shader, "u_Color");
if (location != -1)
glUniform4f(location, 0.2f, 0.3f, 0.8f, 1.0f);
else
std::cerr << "u_Color doesn't exists.n";
/* Loop until the user closes the window */
while (!glfwWindowShouldClose(window))
{
/* Render here */
glClear(GL_COLOR_BUFFER_BIT);
glDrawElements(GL_TRIANGLES, ib.GetCount(), ib.GetDataType(), nullptr);
/* Swap front and back buffers */
glfwSwapBuffers(window);
/* Poll for and process events */
glfwPollEvents();
}
glDeleteProgram(shader);
}
glfwTerminate();
return 0;
}
buffer.h:
#pragma once
#define _LenArr(_Arr) std::extent<decltype(_Arr)>::value
#define _BufferDataParams(_Arr) _Arr, sizeof(_Arr), _LenArr(_Arr)
using GLTYPE = unsigned int;
using Countable = unsigned int;
using LayoutElem = struct {
GLTYPE Type;
unsigned int Count;
size_t ElemSize;
GLTYPE Normalized;
};
struct BufferLayout
{
private:
std::vector<LayoutElem> Layout;
Countable Stride;
public:
BufferLayout() : Stride(0) {}
template<GLTYPE _GL_Ty, size_t _ElemSize>
void Push(Countable Count, GLTYPE normalized = GL_FALSE)
{
Layout.push_back({ _GL_Ty, Count, _ElemSize, normalized });
Stride += Count * _ElemSize;
}
inline const std::vector<LayoutElem>& GetElements() const { return Layout; }
inline Countable GetStride() const { return Stride; }
};
template <unsigned int TYPE, GLTYPE _DataType>
class Buffer
{
private:
unsigned int mRefID;
size_t m_Count;
GLTYPE mDataType;
public:
Buffer(const void* data, size_t size, size_t count,
GLTYPE dataType = _DataType, unsigned int usage = GL_STATIC_DRAW)
: mRefID(0), m_Count(count), mDataType(dataType)
{
glGenBuffers(1, &mRefID);
glBindBuffer(TYPE, mRefID);
glBufferData(TYPE, size, data, usage);
}
inline unsigned int GetRefID() const { return mRefID; }
inline size_t GetCount() const { return m_Count; }
inline GLTYPE GetDataType() const { return mDataType; }
void SetData(const void* data, size_t size, size_t count,
GLTYPE dataType = _DataType, unsigned int usage = GL_STATIC_DRAW)
{
glBindBuffer(TYPE, mRefID);
glBufferData(TYPE, size, data, usage);
m_Count = count;
mDataType = dataType;
}
inline static void Bind(const Buffer& buf)
{ glBindBuffer(TYPE, buf.GetRefID()); }
void BindSelf() const { Bind(*this); }
inline static void Unbind() { glBindBuffer(TYPE, 0); }
void Delete() const { glDeleteBuffers(1, &mRefID); }
~Buffer() { glDeleteBuffers(1, &mRefID);}
};
using VertexBuffer = Buffer<GL_ARRAY_BUFFER, GL_FLOAT>;
using IndexBuffer = Buffer<GL_ELEMENT_ARRAY_BUFFER, GL_UNSIGNED_INT>;
vertexarray.cpp:
#include "stdafx.h"
#include "VertexArray.h"
VertexArray::VertexArray()
: mRefID(0)
{ glGenVertexArrays(1, &mRefID);}
void VertexArray::Bind(const VertexArray& vArr)
{ glBindVertexArray(vArr.GetRefID()); }
void VertexArray::BindSelf() const { Bind(*this); }
void VertexArray::AddBuffer(const VertexBuffer& vBuf, const BufferLayout& bufLayout)
{
BindSelf();
vBuf.BindSelf();
const auto& Layout = bufLayout.GetElements();
Countable i = 0;
size_t offset = 0;
for (LayoutElem _Elem : Layout)
{
std::cout << _Elem.Count << " " << _Elem.Type << " " <<
_Elem.Normalized << " " << bufLayout.GetStride();
glEnableVertexAttribArray(i);
glVertexAttribPointer(i, _Elem.Count, _Elem.Type, _Elem.Normalized,
bufLayout.GetStride(), (const void*)&offset);
offset += _Elem.Count * _Elem.ElemSize;
i++;
}
}
VertexArray::VertexArray(const VertexBuffer& vBuf, const BufferLayout& bufLayout)
: mRefID(0)
{
glGenVertexArrays(1, &mRefID);
AddBuffer(vBuf, bufLayout);
}
void VertexArray::Unbind() { glBindVertexArray(0); }
inline void VertexArray::Delete() const { glDeleteVertexArrays(1, &mRefID); }
VertexArray::~VertexArray() { Delete(); }
我希望看到一个带有蓝色的三角形。为了抽象工作。
问题是行
glVertexAttribPointer(i, _Elem.Count, _Elem.Type, _Elem.Normalized, bufLayout.GetStride(), (const void*)&offset);
由于命名的缓冲区对象绑定到目标GL_ARRAY_BUFFER
,因此glVertexAttribPointer
的最后一个参数被视为字节偏移到缓冲区中。
您尝试将0传递到最后一个参数并将其投放到void*
,但是
(const void*)&offset
是本地变量offset
的地址。只是做(const void*)offset
:
glVertexAttribPointer(i, _Elem.Count, _Elem.Type, GL_FALSE,
bufLayout.GetStride(), (const void*)offset);
进一步指出,glewExperimental = GL_TRUE
似乎错过了您的代码。请参阅GLEW文档:
glewExperimental = GL_TRUE;
if (glewInit() != GLEW_OK)
{
glfwTerminate();
return -1;
}
相关文章:
- 无法通过空白将文本文件行分隔为矢量
- 如何在全屏模式下(在OpenGL中)使背景透明
- OpenSSL TLS服务器-使用客户端证书白名单
- 由cin中的字符串中未捕获空白引起的分割错误
- 如何为窗口截屏
- 尝试从 XamlApplication 编译 C++/WinRT 空白应用程序时,我收到未解析的外部符号 winrt_make_*
- 在打开多个其他窗口时使用全屏窗口时帧速率非常低
- 代码精简版页面变为空白
- Qt QML相机在部署后显示白屏
- OpenGL Glut显示功能在Mojave上显示黑屏
- 在OpenCV C++中创建空白图像
- Gtkmm 窗口为空白,不显示任何小部件或标题
- openGL GLFW 白屏,带加载光标正在运行
- OpenGL显示空白的白屏
- D3D11 着色器编译成功,但出现白屏
- 简单的Qt视频流应用程序,只有声音,没有视频(白屏)
- OpenGL白屏,无响应
- 使用openGL顶点阵列的白屏
- OpenGL 4.4渲染只是白屏
- OpenGL代码在IDE, CodeXL和GPU PerfStudio中完美运行,但如果从Windows启动则给出空白屏