MFC中使用OpenGL深度測驗后影像無法顯示,glEnable(GL_DEPTH_TEST),注釋后可以正常顯示,寫了幾個案例都是同樣問題,代碼如下,望大佬解惑。
unsigned tex;
unsigned tex2;
unsigned tex3;
unsigned Gluint_make(float width,float height ,const void* data){
glEnable(GL_TEXTURE_2D);
unsigned texID;//創建紋理句柄
glGenTextures(1, &texID);//創建幾個紋理,存放在什么地方
glBindTexture(GL_TEXTURE_2D, texID);//系結紋理
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);//模型縮放后紋理的變化演算法
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
return texID;
}
unsigned LodeFreeImage(const char* File_Name){
//獲取檔案格式
FREE_IMAGE_FORMAT fm = FreeImage_GetFileType(File_Name, 0);
if (fm == FIF_UNKNOWN){
return 0;//不支持的格式
}
//加載圖片
FIBITMAP * dib = FreeImage_Load(fm,File_Name,0);
//獲取圖片像素格式
FREE_IMAGE_COLOR_TYPE type = FreeImage_GetColorType(dib);
//使dib格式為32位RGBA統一格式,銷毀原來的dib
FIBITMAP * temp = dib;
dib = FreeImage_ConvertTo32Bits(dib);
FreeImage_Unload(temp);
//獲取圖片顏色的資料值
BYTE* pixels = (BYTE*)FreeImage_GetBits(dib);
//獲取圖片寬高
float width = FreeImage_GetWidth(dib);
float height = FreeImage_GetHeight(dib);
//把圖片顏色資料從BGRA轉換到RGBA
for (int i = 0; i < width*height * 4;i+=4){
BYTE temp = pixels[i];
pixels[i] = pixels[i + 2];
pixels[i + 2] = temp;
}
unsigned rec =Gluint_make(width, height, pixels);
FreeImage_Unload(dib);
return rec;
}
void onInitGL(){
tex = LodeFreeImage("Image/1.jpg");
tex2 = LodeFreeImage("Image/2.jpg");
tex3 = LodeFreeImage("Image/3.jpg");
}
// CMFC_TextureView 繪制
void CMFC_TextureView::OnDraw(CDC* pDC)
{
CMFC_TextureDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: 在此處為本機資料添加繪制代碼
GL_Context1 context;
context.setup(m_hWnd, *pDC);
RECT rect;
::GetClientRect(m_hWnd, &rect);
double _width = rect.right - rect.left;
double _height = rect.bottom - rect.top;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60, double(_width) / double(_height), 0.1, 1000);
struct point_{
float x, y, z;
float u, v;
};
point_ rectangle[] = {
{ -1.0f, -1.0f, 1.0f, 0.3f, 0.3f },
{ 1.0f, -1.0f, 1.0f, 0.5f, 0.3f },
{ 1.0f, 1.0f, 1.0f, 0.5f, 0.8f },
{ -1.0f, 1.0f, 1.0f, 0.3f, 0.8f },
{ -1.0f, -1.0f, -1.0f, 0, 0 },
{ -1.0f, 1.0f, -1.0f, 1, 0 },
{ 1.0f, 1.0f, -1.0f, 1, 1 },
{ 1.0f, -1.0f, -1.0f, 0, 1 },
{ -1.0f, 1.0f, -1.0f, 0, 0 },
{ -1.0f, 1.0f, 1.0f, 1, 0 },
{ 1.0f, 1.0f, 1.0f, 1, 1 },
{ 1.0f, 1.0f, -1.0f, 0, 1 },
{ -1.0f, -1.0f, -1.0f, 0, 0 },
{ 1.0f, -1.0f, -1.0f, 1, 0 },
{ 1.0f, -1.0f, 1.0f, 1, 1 },
{ -1.0f, -1.0f, 1.0f, 0, 1 },
{ 1.0f, -1.0f, -1.0f, 0, 0 },
{ 1.0f, 1.0f, -1.0f, 1, 0 },
{ 1.0f, 1.0f, 1.0f, 1, 1 },
{ 1.0f, -1.0f, 1.0f, 0, 1 },
{ -1.0f, -1.0f, -1.0f, 0, 0 },
{ -1.0f, -1.0f, 1.0f, 1, 0 },
{ -1.0f, 1.0f, 1.0f, 1, 1 },
{ -1.0f, 1.0f, -1.0f, 0, 1 },
};
onInitGL();
glMatrixMode(GL_MODELVIEW);
glDepthFunc(GL_LEQUAL);
// glEnable(GL_DEPTH_TEST);
glBindTexture(GL_TEXTURE_2D, tex);//系結紋理
glEnable(GL_TEXTURE_2D);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);//啟用紋理
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, sizeof(point_), &rectangle[0].x);
glTexCoordPointer(2,GL_FLOAT,sizeof(point_),&rectangle[0].u);
glLoadIdentity();
glTranslatef(3, 3, -10);
glDrawArrays(GL_QUADS, 0, 24);
context.swapBuffer();
}
// CMFC_TextureView 訊息處理程式
void CMFC_TextureView::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此處添加訊息處理程式代碼
OnDraw(&dc);
// 不為繪圖訊息呼叫 CView::OnPaint()
}
uj5u.com熱心網友回復:
問題已經解決uj5u.com熱心網友回復:
你是沒有clear depth buffer吧?uj5u.com熱心網友回復:
在InitGL() 或者類似的初始化OpenGL的地方,會有glEnable(GL_DEPTH_TEST);啟用了之后,OpenGL在繪制的時候就會檢查,當前像素前面是否有別的像素,如果別的像素擋道了它,那它就不會繪制,也就是說,OpenGL就只繪制最前面的一層。
https://blog.csdn.net/sz76211822/article/details/57407130
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/64040.html
標籤:圖形處理/算法
