我正在尝试学习OpenGL,但我还没有掌握它,因为我在第一个障碍遇到了一个问题,我试图显示一个明亮的红色方块,但图像是以栗色为主色调的广场。 (我道歉但由于没有足够的声誉,我无法发布图片:()
我一直在使用SOIL库(http://www.lonesock.net/soil.html)来简化加载纹理的任务,我很确定这就是问题所在。
我理解最明显的答案是不使用SOIL,并在尝试使用扩展之前先学习原始OGL,我确实打算这样做。但是,我仍然希望解决这个问题,以便安心。
我个人的假设是我可能在某处启用了某种阴影,或者有一些OGL或SOIL的怪癖会强制纹理的阴影发生变化,但是我没有足够的经验来解决这个问题。
以下是我认为的相关代码。
void displayBackground()
{
GetTexture("resources/red.png");
glBegin(GL_QUADS);
glTexCoord2f(0, 0); glVertex2f(0, 0);
glTexCoord2f(480, 0); glVertex2f( 480, 0);
glTexCoord2f(480, 480); glVertex2f( 480, 480);
glTexCoord2f(0, 480); glVertex2f(0, 480);
glEnd();
glDisable(GL_TEXTURE_2D);
}
以下是特定于SOIL的代码,据我所知,应该将纯红色纹理加载到活动的OGL纹理中
GLuint GetTexture(std::string Filename)
{
GLuint tex_ID;
tex_ID = SOIL_load_OGL_texture(
Filename.c_str(),
SOIL_LOAD_AUTO,
SOIL_CREATE_NEW_ID,
SOIL_FLAG_POWER_OF_TWO
| SOIL_FLAG_MIPMAPS
| SOIL_FLAG_COMPRESS_TO_DXT
| SOIL_FLAG_DDS_LOAD_DIRECT
);
if( tex_ID > 0 )
{
glEnable( GL_TEXTURE_2D );
glBindTexture( GL_TEXTURE_2D, tex_ID );
return tex_ID;
}
else
return 0;
}
提前感谢任何人了解我可能出错的地方。
@ Nazar554 我假设你的意思是视口?对不起,我知道这是非常基本的OGL内容,我可能听起来很愚蠢,但你必须从某个地方开始吧? :P
/** OpenGL Initial Setup**/
//pixel format descriptor to describe pixel layout of a given surface
PIXELFORMATDESCRIPTOR pfd;
std::memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR));
pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
pfd.nVersion = 1;
pfd.dwFlags = PFD_DRAW_TO_WINDOW |
PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER_DONTCARE;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 32;
pfd.cDepthBits = 16;
pfd.iLayerType = PFD_MAIN_PLANE;
HDC hdc = GetDC(hwnd); //gets device context of hwnd. Device context is a set of graphics objects that define how to draw to the given device
int format = ChoosePixelFormat(hdc, &pfd); //chooses best pixel format for device context given the pfd to be used
SetPixelFormat(hdc, format, &pfd);
HGLRC hglrc;
hglrc = wglCreateContext(hdc); //creates OGL rendering context suitable for drawing on the device specified by hdc
wglMakeCurrent(hdc, hglrc); //makes hglrc the thread's current context. subsequent OGL calls made on hdc
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // Red, Green, Blue, Alpha. (Additive color) Does not need to be updated every cycle
glOrtho(0, 900, 600, 1.0, -1.0, 1.0); //sets co-ordinates system
答案 0 :(得分:0)
将glOrtho
放在glClearColor
之前。您还需要在调用glOrtho
之前选择投影矩阵。
使用此:
glMatrixMode(GL_PROJECTION); // select projection matrix
glLoadIdentity(); // clear it
glOrtho(0, w, h, 0, 0, 1); // compute projection matrix, and multiply identity matrix by it
// w, h is your window size if you are doing 2D
glMatrixMode(GL_MODELVIEW); // select model matrix
另外,如果你正在学习OpenGL,那么最好从现代版本开始(3.3 +或2.1不带旧东西),而不是1.2。他们有很多不同之处,很难忘记你以前学过的一切。对于初学者来说,freeglut或GLFW比纯Win32更简单,更便携。