A l'aide :
Bonjour,
J'ai un projet opengl fonctionne quand je passe wglCreateContext (mais la fonction est obsoléte et sera retirer dans le long terme),
Mais quand je veux utiliser la fonction de remplacement 'wglCreateContextAttribsARB' , aucun primitive dessiner ,seul la fonction glClearColor fonctionne.
Sur le web il n'y pas de sample utilisant la fonction wglCreateContextAttribsARB
Ca ne marche pas , et j'y suis depuis 3 heures.Code:static void init_opengl_extensions(void) { // Before we can load extensions, we need a dummy OpenGL context, created using a dummy window. // We use a dummy window because you can only set the pixel format for a window once. For the // real window, we want to use wglChoosePixelFormatARB (so we can potentially specify options // that aren't available in PIXELFORMATDESCRIPTOR), but we can't load and use that before we // have a context. WNDCLASSA window_class = { 0 }; window_class.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; window_class.lpfnWndProc = DefWindowProcA; window_class.hInstance = GetModuleHandle(0); window_class.lpszClassName = "Dummy_WGL_djuasiodwa"; if (!RegisterClassA(&window_class)) { fatal_error("Failed to register dummy OpenGL window."); } HWND dummy_window = CreateWindowExA( 0, window_class.lpszClassName, "Dummy OpenGL Window", 0, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, window_class.hInstance, 0); if (!dummy_window) { fatal_error("Failed to create dummy OpenGL window."); } HDC dummy_dc = GetDC(dummy_window); PIXELFORMATDESCRIPTOR pfd; pfd.nSize = sizeof(pfd); pfd.nVersion = 1; pfd.iPixelType = PFD_TYPE_RGBA; pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; pfd.cColorBits = 32; pfd.cAlphaBits = 8; pfd.iLayerType = PFD_MAIN_PLANE; pfd.cDepthBits = 24; pfd.cStencilBits = 8; int pixel_format = ChoosePixelFormat(dummy_dc, &pfd); if (!pixel_format) { fatal_error("Failed to find a suitable pixel format."); } if (!SetPixelFormat(dummy_dc, pixel_format, &pfd)) { fatal_error("Failed to set the pixel format."); } HGLRC dummy_context = wglCreateContext(dummy_dc); if (!dummy_context) { fatal_error("Failed to create a dummy OpenGL rendering context."); } if (!wglMakeCurrent(dummy_dc, dummy_context)) { fatal_error("Failed to activate dummy OpenGL rendering context."); } wglCreateContextAttribsARB = (wglCreateContextAttribsARB_type*)wglGetProcAddress( "wglCreateContextAttribsARB"); wglChoosePixelFormatARB = (wglChoosePixelFormatARB_type*)wglGetProcAddress( "wglChoosePixelFormatARB"); wglMakeCurrent(dummy_dc, 0); wglDeleteContext(dummy_context); ReleaseDC(dummy_window, dummy_dc); DestroyWindow(dummy_window); } void EnableOpenGL(HWND hWnd, HDC* hDC, HGLRC* hRC) { init_opengl_extensions(); // get the device context (DC) /*wglCreateContextAttribsARB = (wglCreateContextAttribsARB_type*)wglGetProcAddress( "wglCreateContextAttribsARB"); wglChoosePixelFormatARB = (wglChoosePixelFormatARB_type*)wglGetProcAddress( "wglChoosePixelFormatARB");*/ if ((wglCreateContextAttribsARB != NULL)&&(wglChoosePixelFormatARB!=NULL)) { *hDC = GetDC(hWnd); // int pixel_format_attribs[] = { //WGL_DRAW_TO_WINDOW_ARB, GL_TRUE, //WGL_SUPPORT_OPENGL_ARB, GL_TRUE, //WGL_DOUBLE_BUFFER_ARB, GL_TRUE, //WGL_ACCELERATION_ARB, WGL_FULL_ACCELERATION_ARB, //WGL_PIXEL_TYPE_ARB, WGL_TYPE_RGBA_ARB, //WGL_SAMPLE_BUFFERS_ARB, GL_TRUE , //WGL_COLOR_BITS_ARB, 32, //WGL_DEPTH_BITS_ARB, 24, //WGL_STENCIL_BITS_ARB, 8, //0,0 // }; int pixel_format_attribs[] = { WGL_SUPPORT_OPENGL_ARB, 1, WGL_DRAW_TO_WINDOW_ARB, 1, /*WGL_DRAW_TO_BITMAP_ARB, 1,*/ WGL_DOUBLE_BUFFER_ARB, 1, //WGL_SWAP_LAYER_BUFFERS_ARB, 1, WGL_COLOR_BITS_ARB, 32, WGL_RED_BITS_ARB, 8, WGL_GREEN_BITS_ARB, 8, WGL_BLUE_BITS_ARB, 8, WGL_ALPHA_BITS_ARB, 8, WGL_DEPTH_BITS_ARB, 8, WGL_STENCIL_BITS_ARB, 8, WGL_ACCELERATION_ARB, WGL_FULL_ACCELERATION_ARB, WGL_PIXEL_TYPE_ARB, WGL_TYPE_RGBA_ARB, 0 }; int pixel_format; UINT num_formats; wglChoosePixelFormatARB(*hDC, pixel_format_attribs, 0, 1, &pixel_format, &num_formats); if (!num_formats) { fatal_error("Failed to set the OpenGL 3.3 pixel format."); } PIXELFORMATDESCRIPTOR pfd; DescribePixelFormat(*hDC, pixel_format, sizeof(pfd), &pfd); if (!SetPixelFormat(*hDC, pixel_format, &pfd)) { fatal_error("Failed to set the OpenGL 3.3 pixel format."); } // Specify that we want to create an OpenGL 3.3 core profile context int gl33_attribs[] = { WGL_CONTEXT_MAJOR_VERSION_ARB, 3, WGL_CONTEXT_MINOR_VERSION_ARB, 3, WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_CORE_PROFILE_BIT_ARB, 0, }; *hRC = wglCreateContextAttribsARB(*hDC, 0, gl33_attribs); } else { *hRC = wglCreateContext(*hDC); wglMakeCurrent(*hDC, *hRC); } wglMakeCurrent(*hDC, *hRC); } #endif char checkShaderCompilation(GLuint shaderID) { GLint compilationStatus = 0; // Vérification de la compilation pour le vertex shader glGetShaderiv(opengl.vertexID, GL_COMPILE_STATUS, &compilationStatus); //if (compilationStatus != GL_TRUE) { // Nous savons que la compilation a échoué, donc nous devons savoir pourquoi // Nous devons récupéré la taille du log GLint logLength = 0; char* log = NULL; glGetShaderiv(shaderID, GL_INFO_LOG_LENGTH, &logLength); if (logLength > 0) { // Maintenant que nous avons la taille, nous pouvons alloué la mémoire suffisante pour ce log log = (char*)malloc(logLength); if (log == NULL) { fprintf(stderr, "Erreur d'allocation de mémoire pour le log de la compilation du shader\n"); return 0; } glGetShaderInfoLog(shaderID, logLength, &logLength, log); // On peut afficher le message fprintf(stderr, "Erreur de compilation:\n%s", log); MessageBox(NULL, log, NULL, MB_ICONHAND); // Et on n'oublie pas de libéré la mémoire free(log); return 0; } else return 1; } return 1; // Pas d'erreur }
Pour information je travaille sous Vmware player 17.01 : 17.0.1 build-21139696
Ce n'est pas un probléme de shader.
Merci
-----