I am creating a generic custom controls (for instance, say button) using OpenGL for drawing. So what I did is, created a window and initialized the OpenGL with window handle and DC. And drawn something to OpenGL context and so on.
So when multiple instance of my control is used, the OpenGL context will be created for each (control) window.
My question is that, creating many OpenGL contexts (with wglCreateContext) is having problems of any kind?
I have some images in an old non-standard file format that I'd like to display into the MDI window of my new app. I've got the image read in from the file and MFC is making the correct size window for it but how do I blt the array to the window?
I'm fairly sure that there is no existing MFC function that will do this easily. But, if you want to use the BitBlt[^] GDI function to display your array, it must be in the native windows bitmap format. I have no idea what your "old non-standard file format" is like. But, if you can read the existing pixel data into a continuous linear array, with a bit depth that is equivalent to one of the standard bitmap bitsperpixel values (16, 24, or 32 bpp), and write the headers yourself, it should work. You should read this: Bitmap Header Types[^].
Hey I just got it working, thank God! I've been using the CImage class to load in all the other types of images and I just do a CImage::Create to setup a bitmap with the correct dimensions and bpp, and then call SetPixel to load each pixel into the bitmap. It works! Maybe a little slow for some larger images but it works. I tried this before w/o the Create call and it didn't work, so that was the key.
There might be a faster way so if you think of one let me know.
I would like to check the following idea having problems or not...
1. Initiates openGL with double buffer enabled
2. Render something to back buffer and call SwapBuffers.
3. Render the same again. (To fill the other buffer)
4. Called SwapBuffers only for handling WM_PAINT. That is, no repeated rendering since there is no change in what to draw.
So the point is that, rendering is done when needed to modify the drawing. But whenever repainting is needed the buffer is just swapped to retain the painting. I checked the same and its working fine. But rendering need to be done two times to update both front and back buffers.
Is this way OK? If so how can I avoid the rendering two times?
Matters on what you are trying to do, you don't need to use wm_paint at all, you can update the render whenever you feel you need to.
If you need to continually update the window, u can use a pump, ie:
I get the feeling that the best approach for you is to use a FBO and do offscreen rendering.
Google "opengl render to texture", you can bind a frame buffer at the start of your rendering, then blit it as needed.
I'm working with a file format that outputs graphics (in line segments only, no polygons, no points), but has a very screwy way of doing so. Without giving too much away, I'm able to retrieve the list of points from the file with some fairly straightforward calls. However, I need to transform these points and store them (they'll later be used to draw, but I need the points for further manipulation). The problem is that the way the points are currently stored is as follows:
A) The origin (0,0) is in the middle of the drawing, like you would have on a piece of graph paper. I need to transform it so that it will look right on the screen.
B) The image is centered on the origin.
C) The image is inverted along the Y axis.
D) The points in question are already in a nice data structure that includes color and other information.
How can I quickly transform all these points such that if I just used DrawLines, that they would come out correctly? All the matrix code I can find is based around applying transforms to the graphics object, which I don't need to do at the moment. Also, in what order should I do the relevant transforms? I'm thinking that I should flip it first, then shift it (+width, +height). Is that the correct approach?
Performance is not an issue, as users won't be waiting on this operation to complete (or if they are, I can revisit the issue with the intent of collecting more money from them).
you would need one or more of the transform methods in the Graphics class.
Graphics.TranslateTransform does translation, such as moving the origin to the center;
Graphics.ScaleTransform does scaling, and if you use a negative number you are actually flipping the drawing;
Graphics.RotateTransform does rotations, which you don't seem to need.
I trust all of these internally construct a single 3*3 transformation matrix which then gets applied
to all the drawing methods called thereafter.
When you would use more than one of the above, you can choose the order; first scale, then translate,
or first translate, then scale can be made to result in exactly the same, but it would require different parameter values since the first transformation gets applied to the parameters of the second translation.
You can also calculate the entire transformation matrix yourself and just use Graphics.Matrix
Hint: initially you will probably make mistakes in the polarity and magnitude of the transformation parameters, sending your points way outside your plotting area, hence I suggest you start with a very small drawing in a big surface, improving the chance you do see something. You then can fix whatever needs fixing step by step.
As a heads up - keep in mind the GDI+ Matrix object is marked IDisposable. Fairly crazy for a small float array I know - but you will leak handles if you don't dispose of it.
Also creating / destroying these seems to be moderately expensive. I used GDI+ for a crap debug renderer for Entanglar before I got a DirectX one up - and it was quite slow until I started reusing the "camera" matrix every frame with "LoadThisStuff(float)".
I wish they had a way to transform Size objects. Say, for instance that I'm measuring a piece of text and I get a size from it. If the text is going to be rotated, I need to somehow figure out how large it will be, but the matrix object doesn't have any methods for this.
it all is a bit mysterious...
And I never used Matrix class explicitly; at most I use Graphics.TranslateTransform() and similar
methods, without touching the matrices myself.
Luc Pattyn [Forum Guidelines][My Articles] - before you ask a question here, search CodeProject, then Google
- the quality and detail of your question reflects on the effectiveness of the help you are likely to get
- use the code block button (PRE tags) to preserve formatting when showing multi-line code snippets
I am currently using bitmap fonts in a Win32 application, following closely the method presented in NeHe's tutorial 13[^] (wglUseFontBitmaps, glRasterPos2f, glCallLists etc.).
I have found that for most graphics cards everything works as expected, however for some "cheap" graphics cards (e.g., on board a toshiba laptop of a work mate) no text is displayed. I have checked all the font creation and drawing calls for errors and no errors are being returned. I would like to have bitmap fonts work on all hardware instead of use a different method for displaying fonts.
I am posting in the hope that some guru here has seen this behavour and worked out what is going on, because I am stuck.
Solved my own problem in the end after being stuck for a couple of days.
I was drawing a quad as a background and then drawing the text on top of the quad. After significant trial and error, I realised that he glCallLists function used to display the bitmap characters was being processed after the quad was being drawn, causing the text to appear behind the quad instead of on top of it, but only on some hardware.
The solution was as simple as changing the z location of the text (using glRasterPos3i instead of glRasterPos2i) so the text is explicitly above the background quad.
Thanks to anybody following this post and obscure bug for your reading time!
I have a problem. I cant get to refresh an image the second time it should be displayed. I am using gdi+ function Graphics::DrawImage. The image displays correctly but the second time (in a loop) the function is called the image isn't refreshed. Instead the image stays (on screen) as the first time it was drawn. I know that the image (bitmap) is changed between the two calls for DrawImage function because, when I do something with the window the image is drawn to, (like resizing it, minimizing etc.), the image is refreshed, but if I do nothing the image stays as it is the first time DrawImage draws it. I am changing image's pixels in another function named Render(), that is called before DrawImage.
Is there another function that draws image on screen, or is there a clear screen function. (I tried with graphics.Clear(color) function but after it the screen is filled with the color 'color' and again it it stays like that indefinitely)
The bitmap is created in memory and isn't read from the disk (although it's the same thing once it is in memory).
Here is part of the code which is called continously (in a loop):