我正在按照教程使用OpenGL在屏幕上画一个三角形。我已经正确地遵循了所有的步骤,但我只得到一个绿色屏幕,没有三角形。
这是我现在的代码。在应用程序初始化期间调用DrawScene,并在每个WM_DRAW中调用ResizeScene。我的问题是:为什么三角形没有显示在我的代码中?
OpenGL版本:4.6
#include "glew.h"
GLuint program;
GLuint VAO, VBO, EBO;
void DrawScene(HWND _hWnd);
void SetupShaders()
{
const char* vertexSource = {
"#version 130 core\n"
"layout (location = 0) in vec3 iPos;\n"
"void main()\n"
"{\n"
" gl_Position = vec4(iPos, 1.0f);\n"
"}\n"
"\0"
};
GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, &vertexSource, NULL);
glCompileShader(vertexShader);
const char* fragmentSource = {
"#version 130 core\n"
"out vec4 FragColor;\n"
"void main()\n"
"{\n"
" FragColor = vec4(1.0f, 0.0f, 1.0f, 1.0f);\n"
"}\n"
"\0"
};
GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &fragmentSource, NULL);
glCompileShader(fragmentShader);
program = glCreateProgram();
glAttachShader(program, vertexShader);
glAttachShader(program, fragmentShader);
glBindAttribLocation(program, 0, "iPos");
glLinkProgram(program);
}
void SetupBuffers()
{
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);
glGenBuffers(1, &EBO);
float vertexData[] = {
0.0f, 0.0f, 0.0f,
10.0f, 10.0f, 0.0f,
10.0f, 0.0f, 0.0f,
0.0f, 10.0f, 0.0f
};
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData), vertexData, GL_STATIC_DRAW);
unsigned int indexData[] = {
0, 1, 2,
1, 2, 3
};
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indexData), indexData, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, false, sizeof(float) * 3, (void*)0);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glBindVertexArray(0);
}
void SetupScene(HWND& _hWnd)
{
static PIXELFORMATDESCRIPTOR pfd = // pfd Tells Windows How We Want Things To Be
{
sizeof(PIXELFORMATDESCRIPTOR), // Size Of This Pixel Format Descriptor
1, // Version Number
PFD_DRAW_TO_WINDOW | // Format Must Support Window
PFD_SUPPORT_OPENGL | // Format Must Support OpenGL
PFD_DOUBLEBUFFER, // Must Support Double Buffering
PFD_TYPE_RGBA, // Request An RGBA Format
32, // Select Our Color Depth
0, 0, 0, 0, 0, 0, // Color Bits Ignored
0, // No Alpha Buffer
0, // Shift Bit Ignored
0, // No Accumulation Buffer
0, 0, 0, 0, // Accumulation Bits Ignored
16, // 16Bit Z-Buffer (Depth Buffer)
0, // No Stencil Buffer
0, // No Auxiliary Buffer
PFD_MAIN_PLANE, // Main Drawing Layer
0, // Reserved
};
HDC hdc = GetDC(_hWnd);
int pf = ChoosePixelFormat(hdc, &pfd);
SetPixelFormat(hdc, pf, &pfd);
HGLRC hglrc = wglCreateContext(hdc);
wglMakeCurrent(hdc, hglrc);
glewInit();
ShowWindow(_hWnd, SW_SHOW);
SetForegroundWindow(_hWnd);
SetFocus(_hWnd);
SetupShaders();
SetupBuffers();
}
void ResizeScene(HWND& _hWnd, size_t _width, size_t _height)
{
if (!_height)
{
_height = 1;
}
glViewport(0, 0, _width, _height);
DrawScene(_hWnd);
}
void DrawScene(HWND _hWnd)
{
HDC hdc = GetDC(_hWnd);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
glUseProgram(program);
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, 0);
SwapBuffers(hdc);
}
您确实需要启用调试验证层并检查错误,因为在您的代码中有一大堆容易理解的错误:
>
不要使用GLBindatTribLocation
。IPOS
已(正确地)绑定到布局位置0,您只是破坏了它。
您没有分离和删除您的着色程序后,您链接的程序,因此泄漏了内存。
不要解除顶点和元素缓冲区与顶点数组的绑定,这是使用顶点数组的全部要点。
与3相关,不要在每次呈现时更改顶点数组的顶点和元素缓冲区。只需设置一次顶点缓冲区。
您告诉OpenGL您的索引元素是gldrawelements
中的字节,而是将它们作为32位整数上载。要始终如一。
手指任意点击屏幕三点,绘制三角形。 [Code4App.com]
我有一个问题,找到一种方法来在正确的时间烧毁游戏结束屏幕。我做了一个平台上pyplay和我想游戏在屏幕上出现后,我的角色死亡的动画已经发生,当敌人有他的攻击动画。现在它绕过任何动画,一旦精灵之间的冲突检测为真,它就说游戏结束。有什么想法吗? 谢谢
问题内容: 我正在学习有关使用OpenGL在Java中创建游戏引擎的教程。 我正在尝试在屏幕上渲染一个三角形。一切运行正常,我可以更改背景颜色,但三角形不会显示。我也尝试过运行作为教程系列的一部分提供的代码,但仍然无法正常工作。 链接至教程:http : //bit.ly/1EUnvz4 链接到视频中使用的代码:http : //bit.ly/1z7XUlE 建立 我试过检查OpenGL版本,但相
我们当前的任务要求我们在openGL中使用较旧的固定管道方法。我们使用的是LWJGL 2.9.3。下面的代码显示一个三角形。问题是,它会疯狂地闪烁。显示器。swapBuffers()方法不会引发异常,并且无论是否包含它都没有任何区别。我根据这个问题创建了这个示例: gluPerspective、GluViewport、gluLookAt以及GL_投影和GL_MODELVIEW矩阵 编辑 还有一件事
我正试图用java设计一个程序,定期(每100毫秒左右)拍摄我的屏幕截图,并计算整个屏幕的平均像素rgb值。我需要这个来处理视频游戏和iTunes/Quicktime视频。然而,我曾尝试使用JNA和robot来捕获屏幕,它只在我没有捕获全屏或iTunes视频的视频游戏时起作用。例如,我通过保存一个图像来测试代码,以检查并查看发生了什么。当我玩电子游戏时,我只看到一个空白窗口的截图。我认为这是因为游
我在给吉拉写小玩意时总是遇到一些奇怪的问题。我遇到了一些问题,比如选项被剪掉了,重新配置不起作用,最令人恼火的是:projectOrFilterPicker不起作用。 我遇到的大多数奇怪问题我都可以解决,这就是我所做的,但是我需要允许用户使用快速搜索框来选择项目或过滤器。然而,当我加入其中一个对话框时,这个小工具就会无休止地加载,如果我调整屏幕大小(我用于其他事情的解决方法之一),我会得到一个错误