- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试使用 Windows 函数创建 OpenGL 上下文(现代版)。
基本上代码就是:
PIXELFORMATDESCRIPTOR
并设置glewInit()
在此之后,我尝试绘制一个正方形(使用 VAO 和 VBO)。
结果是:Windows 窗口有效,glClear(GL_COLOR_BUFFER_BIT)
有效,但未绘制正方形(display()
函数)。
如果我使用 OpenGL 2.0 上下文,它会绘制正方形(像以前一样使用 VAO 和 VBO),所以问题一定出在 OpenGL 3.2 的初始化上。
我哪里错了?
代码如下:
#include <iostream>
#include <GL/glew.h>
#include <GL/wglew.h>
#include <windows.h>
#include <string>
using namespace std;
bool progRun = false;
void display(){
glUseProgram(shaderProg);
glBindVertexArray(vao[0]);
glDrawArrays(GL_QUADS, 0,4);
}
string errorStr = "none";
PIXELFORMATDESCRIPTOR pfd;
HGLRC hrc; // vars to init glew
HDC hdc;
HWND hwnd;
HGLRC hrc1; //vars for the real window
HDC hdc1;
HWND hwnd1;
LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM ); // window event hadler prototype
//-------------------- INIT OPENGL
int initOpengl(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
)
{
//---- fake Window
WNDCLASSEX wcex;
wcex.cbSize = sizeof( WNDCLASSEX );
wcex.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon( NULL, IDI_APPLICATION );
wcex.hCursor = LoadCursor( NULL, IDC_ARROW );
wcex.hbrBackground = (HBRUSH)( COLOR_WINDOW + 1 );
wcex.lpszMenuName = NULL;
wcex.lpszClassName = "coco";
wcex.hIconSm = NULL;
if( !RegisterClassEx( &wcex ) )
{
errorStr = "RegisterClassEx";
return 0;
}
hwnd = CreateWindow(
"coco",
"dddd",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
500, 500,
NULL,
NULL,
hInstance,
NULL
);
hdc = GetDC( hwnd );
memset( &pfd, 0, sizeof( PIXELFORMATDESCRIPTOR ) );
pfd.nSize = sizeof( PIXELFORMATDESCRIPTOR );
pfd.dwFlags = PFD_DOUBLEBUFFER | PFD_SUPPORT_OPENGL | PFD_DRAW_TO_WINDOW;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 32;
pfd.cDepthBits = 32;
pfd.iLayerType = PFD_MAIN_PLANE;
int nPixelFormat = ChoosePixelFormat( hdc, &pfd );
SetPixelFormat( hdc, nPixelFormat, &pfd );
hrc = wglCreateContext( hdc );
wglMakeCurrent( hdc, hrc );
glewExperimental = true;
glewInit();
//---------------For the real window
if( wglewIsSupported( "WGL_ARB_create_context" ) == 1 )
{
wglMakeCurrent( NULL, NULL );
wglDeleteContext( hrc );
ReleaseDC( hwnd, hdc );
DestroyWindow( hwnd );
hwnd1 = CreateWindow(
"coco",
"ddddd",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
500, 500,
NULL,
NULL,
hInstance,
NULL
);
hdc1 = GetDC( hwnd1 );
const int iPixelFormatAttribList[] = {
WGL_DRAW_TO_WINDOW_ARB, GL_TRUE,
WGL_SUPPORT_OPENGL_ARB, GL_TRUE,
WGL_DOUBLE_BUFFER_ARB, GL_TRUE,
WGL_PIXEL_TYPE_ARB, WGL_TYPE_RGBA_ARB,
WGL_COLOR_BITS_ARB, 32,
WGL_DEPTH_BITS_ARB, 24,
WGL_STENCIL_BITS_ARB, 8,
0 // End of attributes list
};
int attributes[] = {
WGL_CONTEXT_MAJOR_VERSION_ARB, 3
, WGL_CONTEXT_MINOR_VERSION_ARB, 2
, WGL_CONTEXT_FLAGS_ARB, WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB
, 0
};
int nPixelFormat = 0;
UINT iNumFormats = 0;
wglChoosePixelFormatARB( hdc1, iPixelFormatAttribList, NULL, 1, &nPixelFormat, (UINT*)&iNumFormats );
SetPixelFormat( hdc1, nPixelFormat, &pfd );
hrc1 = wglCreateContextAttribsARB( hdc1, 0, attributes );
wglMakeCurrent( NULL, NULL );
wglMakeCurrent( hdc1, hrc1 );
}
else
{
errorStr = "WGL_ARB_create_context";
return 0;
}
return true;
}
// MAIN -----
int CALLBACK WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
)
{
initOpengl( hInstance, hPrevInstance, lpCmdLine, nCmdShow );
ShowWindow( hwnd1, SW_SHOW );
glClearColor( 1, 0, 0, 1 );
MSG msg;
progRun = true;
while( progRun )
{
if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
glClear( GL_COLOR_BUFFER_BIT );
glViewport( 0, 0, 500, 500 );
display();
SwapBuffers( hdc1 );
}
return 0;
}
LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
{
return DefWindowProc( hWnd, message, wParam, lParam );
}
最佳答案
问题不仅出在上下文创建代码上,还出在所使用的 OpenGL 版本和绘图代码的组合上。
在问题中完成请求 OpenGL 上下文时,可以设置几个属性。此处相关的是 WGL_CONTEXT_PROFILE_MASK_ARB
(未设置)。 extension description状态:
The default value for WGL_CONTEXT_PROFILE_MASK_ARB is WGL_CONTEXT_CORE_PROFILE_BIT_ARB. [...] If the requested OpenGL version is less than 3.2, WGL_CONTEXT_PROFILE_MASK_ARB is ignored and the functionality of the context is determined solely by the requested version.
这意味着问题中的代码在不工作的版本中请求 OpenGL 3.2 核心配置文件,在另一种情况下请求 3.1(兼容性)配置文件。
在核心配置文件中,使用 GL_QUADS
作为 glDrawArrays
的模式已被弃用且不能使用。因此,不会渲染四边形。请注意,如果您检查代码中的 OpenGL 错误 (glGetError
),您会更快地发现问题,因为它会为绘图命令报告 GL_INVALID_ENUM
。
解决问题的方法有两种:
GL_TRIANGLES
)。这是推荐的方式。WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB
的 WGL_CONTEXT_PROFILE_MASK_ARB
明确请求 OpenGL 3.2 兼容性配置文件。但请注意,这可能会在未来引起问题,因为将旧的 OpenGL 代码与现代 OpenGL 代码混合会导致问题。关于c++ - 使用 WGL 创建现代 OpenGL 上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46655372/
我正在尝试通过 Windows API 创建 OpenGL 上下文。目前其他一切都很好,但我只是不知道如何链接正确的库以访问 wgl.. 函数。 我使用 MinGW 编译。和一个制作文件。我试图链接到
我在 Windows 下的 OpenGL 上下文中绘制文本,使用以下辅助函数,我从 http://nehe.gamedev.net/tutorial/bitmap_fonts/17002/ 获得了 i
我是 OpenGL/OpenCL 的初学者。我正在尝试执行 this 中的代码示例,但出现错误: Traceback (most recent call last): File "/home/anka
我通常使用 wglChoosePixelFormatARB() 和这些参数(以及其他参数)创建像素格式: WGL_DOUBLE_BUFFER_ARB = GL_TRUE WGL_SAMPLE_BUFF
我正在尝试使用 Windows 函数创建 OpenGL 上下文(现代版)。 基本上代码就是: 创建窗口类 注册类(class) 创建一个窗口 选择PIXELFORMATDESCRIPTOR并设置 创建
有一个有趣的浏览器框架叫做Awesomium ,它基本上是 Chromium 浏览器引擎的包装器。 我有兴趣使用它为桌面重新分发基于 WebGL 的游戏。然而 Awesomium 只支持使用发送到 C
我对 OpenGL 比较陌生,我想为我的 C++ Win32 项目添加抗锯齿功能。我目前在接收到 WM_CREATE 消息时在窗口过程中获取设备上下文,然后使用像素格式描述符创建 OpenGL 上下文
我正在创建一个游戏引擎,并从简单的 openGL 窗口创建开始。我正在使用 visual studio 2013,引擎正在构建为 dll。这是初始化 openGL 的 dll 中的代码: bool A
我试图让 GLFW3 在我的 Windows 8 计算机上使用 MinGW 运行,但收效甚微。我直接从 GLFW 文档复制了这个测试程序(进行了一些编辑以使其与共享库一起工作),我正在尝试运行它: #
所以我已经遵循了 OpenGL 渲染上下文的 Windows 创建中的所有基本说明 问题是当我尝试使用 opengl 创建一个核心配置文件上下文时,它失败了,当我运行 a.exe 文件时,我从 Win
我正在将我的简单 lwjgl3 游戏移植到 C++,并得到了错误:WGL:驱动程序似乎不支持 OpenGL。代码在 Java 中几乎相同,所以我想知道出了什么问题以及如何解决它: int main(i
我正在使用 Win32 API 处理 OpenGL。因此我正在使用 wgl (Wiggle)。一切安好。除非我想使用 FREEGLUT 库中的一些形状。例如,茶壶。我正在查看 freeglut 的源代
我是一名优秀的程序员,十分优秀!