求openGL大神!!为什么加入了了模拟水面之后,导进去的3DS的模型是黑的,跪谢!!

ljf8609390 2016-09-15 03:09:57
/////////////////////////////////////////////////////////////////////////////
// CMyWaterView drawing

void CMyWaterView::OnDraw(CDC* pDC)
{
CMyWaterDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
//////////////////////////////////////////////////////////////////
RenderScene(); //渲染场景;
//////////////////////////////////////////////////////////////////

}

int CMyWaterView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;

// TODO: Add your specialized creation code here
//////////////////////////////////////////////////////////////////
//初始化OpenGL和设置定时器
m_pDC = new CClientDC(this);
SetTimer(1, 20, NULL);
InitializeOpenGL(m_pDC);
//////////////////////////////////////////////////////////////////
InitializeTexture();
Init();
return 0;
}


//////////////////////////////////////////////////////////
// 初始化openGL场景;
//////////////////////////////////////////////////////////
BOOL CMyWaterView::InitializeOpenGL(CDC* pDC)
{
m_pDC = pDC;
SetupPixelFormat();
//生成绘制描述表;
m_hRC = ::wglCreateContext(m_pDC->GetSafeHdc());
//置当前绘制描述表;
::wglMakeCurrent(m_pDC->GetSafeHdc(), m_hRC);

return TRUE;
}

//////////////////////////////////////////////////////////
// 设置像素格式;
//////////////////////////////////////////////////////////
BOOL CMyWaterView::SetupPixelFormat()
{
PIXELFORMATDESCRIPTOR pfd = {
sizeof(PIXELFORMATDESCRIPTOR), // pfd结构的大小;
1, // 版本号 ;
PFD_DRAW_TO_WINDOW | // 支持在窗口中绘图 ;
PFD_SUPPORT_OPENGL | // 支持 OpenGL ;
PFD_DOUBLEBUFFER, // 双缓存模式 ;
PFD_TYPE_RGBA, // RGBA 颜色模式 ;
24, // 24 位颜色;深度 ;
0, 0, 0, 0, 0, 0, // 忽略颜色位 ;
0, // 没有非透明度缓存 ;
0, // 忽略移位位;
0, // 无累加缓存 ;
0, 0, 0, 0, // 忽略累加位 ;
32, // 32 位深度缓存 ;
0, // 无模板缓存 ;
0, // 无辅助缓存;
PFD_MAIN_PLANE, // 主层 ;;
0, // 保留 ;
0, 0, 0 // 忽略层,可见性和损毁掩模 ;
};
int pixelformat;
pixelformat = ::ChoosePixelFormat(m_pDC->GetSafeHdc(), &pfd);//选择像素格式;
::SetPixelFormat(m_pDC->GetSafeHdc(), pixelformat, &pfd); //设置像素格式;
if(pfd.dwFlags & PFD_NEED_PALETTE)
SetLogicalPalette(); //设置逻辑调色板;
return TRUE;
}


//画3ds模型;
void CMyWaterView::Draw3ds()
{

glRotatef(90.f,0.0f,0.0f,1.0f);

glRotatef(-90.f,0.0f,1.0f,0.0f);
glTranslatef(-5000.0f,0.5f,3350.5f);
if (m_3dsLoaded)
{
//glColor3f(1.f,0.f,0.f);

m_triList.drawGL();
}
}

BOOL CMyWaterView::OpenFile(LPCTSTR lpszPathName)
{
char* file = new char[strlen(lpszPathName)];
strcpy(file, lpszPathName);

C3dsReader Loader;
BOOL result;
if( m_triList.getNumObjects() > 0 ) m_triList.removeAllObjects();

result = Loader.Reader(file, &m_triList);
if( result)
{
m_3dsLoaded = TRUE;
m_triList.doAfterMath();

}

return result;


}

void CMyWaterView::Init(GLvoid)
{

m_3dsLoaded = FALSE;

camPos[0] = 0.0f;
camPos[1] = 0.0f;
camPos[2] = -100.0f;
camRot[0] = 20.0f;
camRot[1] = -20.0f;
camRot[2] = 0.0f;

scenePos[0] = 0.0f;
scenePos[1] = 0.0f;
scenePos[2] = 0.0f;
sceneRot[0] = 0.0f;
sceneRot[1] = 0.0f;
sceneRot[2] = 0.0f;
mouseprevpoint.x = 0;
mouseprevpoint.y = 0;
mouserightdown = FALSE;
mouseleftdown = FALSE;


m_triList.Init();

::glShadeModel(GL_FLAT);

//::glClearColor(0.0F, 0.0F, 0.0F, 0.0F);

::glClearDepth(1.0F);

::glEnable(GL_DEPTH_TEST);

::glEnable(GL_CULL_FACE);

GLfloat ambientLight[] = { 0.3f, 0.3f, 0.3f, 1.0f};
GLfloat diffuseLight[] = { 0.7f, 0.7f, 0.7f, 1.0f};
GLfloat lightPos[] = {6000.0f,6000.0f,6000.0f, 1.0f};

glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight);
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight);
glLightfv(GL_LIGHT0, GL_POSITION, lightPos);
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientLight);

glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);

}


void CMyWaterView::SetCamPos(int axis, int value, BOOL increment, BOOL apply)
{
if(increment)
{
camPos[axis] += (float)value*camPos[axis]/100;
}
else
{
camPos[axis] = (float)value/2;
}

::glMatrixMode(GL_MODELVIEW);
::glLoadIdentity();

RenderScene();

}

void CMyWaterView::SetSceneRot(int axis, int value, BOOL increment, BOOL apply)
{
if(increment)
sceneRot[axis] += (sceneRot[axis] >=360) ? (-360 + value/2): value/2;
else
sceneRot[axis] = (sceneRot[axis] >=360) ? (-360 + value/2): value/2;

RenderScene();
}

//void CMyWaterView::drawGL()
//{
// for (int i=0; i <numobjects; i++)
// {
// objects[i]->drawGL();
// }
//}


//////////////////////////////////////////////////////////
// 场景绘制与渲染;
//////////////////////////////////////////////////////////
BOOL CMyWaterView::RenderScene()
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); //清屏;
glPushMatrix();
//glRotated(90,0,1,0); //海面绕y轴旋转90度;
//glScalef(3,1,3); //海面沿X Z轴放大三倍;
glScalef(10,1,10); //海面沿X Z放大10倍;
if (!rgb)
glColor3f(.31, .41, .97); //如果纹理不是彩色则用蓝色海面;
else
glColor3f(1.f,1.f,1.f); //白色;
glTranslatef(0.f,-1.f,0.f); //让平画下一点,否则正好与眼睛同一高度看不见;
glMatrixMode(GL_TEXTURE); //矩阵堆栈切换成纹理矩阵;
glPushMatrix();
glTranslatef(ttrans[0], ttrans[1], 0.); //纹理映射坐标系平移;
glScalef(10.f, 10.f,1.f); //纹理映射坐标系放大;
draw_mesh();
glPopMatrix();
glMatrixMode(GL_MODELVIEW); //矩阵堆栈切换回模型矩阵;

glLoadIdentity();

//DrawAxis();

Draw3ds();
glPopMatrix();

ttrans[0] += .005f; //纹理坐标系的平移量不断变化;
if (ttrans[0] == 1.0f) ttrans[0] = 0.0f; //如果大过1,让其轮回;
ttrans[1] -= .0025f; //纹理坐标系的平移量不断变化;
if (ttrans[1] <= 0.0f) ttrans[1] = 1.0f; //轮回;

::SwapBuffers(m_pDC->GetSafeHdc()); //交互缓冲区;
return TRUE;
}









void CMyWaterView::InitializeTexture()
{


unsigned *image; //纹理图像的像素数据指针;
int width, height, components; //图像的宽度 高度 颜色通道数;
char* filename; //
//filename="ocean.jpg"; //
filename="water1.bw"; //
if (filename)
{
//使用MyTexture的现成方法加载数据;
image = m_Tex->read_texture(filename, &width, &height, &components);
if (image == NULL)
{
AfxMessageBox("不能装入图形文件!");
}
if (components < 3) rgb = 0; //如果不是彩色图像则做这个标志;
} else
{
int i, j;
unsigned char *img;
components = 4; width = height = 512;
image = (unsigned *) malloc(width*height*sizeof(unsigned));
img = (unsigned char *)image;
for (j = 0; j < height; j++)
for (i = 0; i < width; i++)
{
int w2 = width/2, h2 = height/2;
if (i & 32)
img[4*(i+j*width)+0] = 0xff;
else
img[4*(i+j*width)+1] = 0xff;
if (j&32)
img[4*(i+j*width)+2] = 0xff;
if ((i-w2)*(i-w2) + (j-h2)*(j-h2) > 64*64 &&
(i-w2)*(i-w2) + (j-h2)*(j-h2) < 300*300) img[4*(i+j*width)+3] = 0xff;
}
}
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
//glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, cloud_color);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexImage2D(GL_TEXTURE_2D, 0, components, width,
height, 0, GL_RGBA, GL_UNSIGNED_BYTE,
image);
glEnable(GL_TEXTURE_2D);
glMatrixMode(GL_PROJECTION); //切换矩阵堆栈为投影矩阵;
glLoadIdentity(); //矩阵重置为单位阵;
gluPerspective(50.,1.,.1,10.); //设置视景体;
//gluPerspective(50.,1.,.1,far_cull = 10.); //设置视景体;
glMatrixMode(GL_MODELVIEW); //矩阵堆栈切换回模型矩阵;
//glLoadIdentity();
//矩阵重置为单位阵;
glTranslatef(0.,0.,-5.5); //把视点与原点拉开距离;




}


void CMyWaterView::draw_mesh(void)
{


if (mesh) //加入一个mesh变量来 控制画网格还是画平面;
{

glRectf(-0.5f, -0.5f, 0.5f, 0.5f);
glBegin(GL_QUADS);
glTexCoord2f(0, 0); glVertex3f(-1.f, 0.f, -1.f);
glTexCoord2f(0, 1); glVertex3f(-1.f, 0.f, 1.f);
glTexCoord2f(1, 1); glVertex3f( 1.f, 0.f, 1.f);
glTexCoord2f(1, 0); glVertex3f( 1.f, 0.f, -1.f);
glEnd();
}
else
{
int i, j;
static float off;
float d = 1.f/MESH;
for(i = 0; i < MESH; i++)
{
glBegin(GL_TRIANGLE_STRIP);
for(j = 0; j < MESH; j++)
{
float s = (float)j*d;
float t = (float)i*d;
float x = -1.0 + 2.f*s;
float z = -1.0 + 2.f*t;
float y = amplitude*sinf(freq*2.f*M_PI*t+off);
glTexCoord2f(s, t); glVertex3f(x, y, z);
s += d; t += d;
x = -1.0 + 2.f*s;
z = -1.0 + 2.f*t;
y = amplitude*sinf(freq*2.f*M_PI*t+off);
glTexCoord2f(s, t); glVertex3f(x, y, z);
off += phase;
}
glEnd();
}
}
}



...全文
693 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧