1. OpenGL 小游戲 源碼
C3DN論壇里搜索」游戲「就能找到很多Opengl游戲源碼了。比如」坦克大戰「、」3D檯球「、」雷霆戰機「、」國際象棋「、」國產CS「。。。。
2. 搜到一個 opengl對實體進行布爾運算的源代碼。原本是使用glut函數寫的。我把它移到的VC的Cview類中去。
你就可以算是大俠了,這么牛,openGL還能布爾運算啊,cube與sphere運算難道不是頂點運算么?頂點都不一樣怎麼算。。不理解,學習中。。。。
3. 誰有OpenGL源碼,麻煩分享一下
http://oss.sgi.com/
pdf格式的鏈接
NeHe OpenGL Tutorial 中文版(介紹glut,有源碼下載,只到第8課)
http://www.amanpage.com/Articles/opengl/NeHe_OGL_T_TIC.htm
OpenGL電子書籍集[下載]
http://www.86vr.com/teach/cursor/200501/4976.html
4. 求wince 下用opengl es 畫一個三角形的代碼
下面是繪制的函數
void Render()
{
static int rotation=0;
GLshort vertexArray[9]={-25,-25,0, 25,-25,0, 0,25,0 };
GLubyte colorArray[12]={255,0,0,0, 0,255,0,0, 0,0,255,0 };
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatex(0,0,FixedFromInt(-10));
glRotatex(FixedFromInt(rotation++),0,ONE,0);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3,GL_SHORT,0,vertexArray);
glEnableClientState(GL_COLOR_ARRAY);
glColorPointer(4,GL_UNSIGNED_BYTE,0,colorArray);
glDrawArrays(GL_TRIANGLES,0,3);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
eglSwapBuffers(glesDisplay,glesSurface);
}
其中vertexArray指定3個頂點的坐標值,
glVertexPointer(3,GL_SHORT,0,vertexArray);完成三角形的繪制
另外完整源代碼如下:
// hello.cpp : 定義應用程序的入口點。
//
#include "stdafx.h"
#include "hello.h"
#include <windows.h>
#include <commctrl.h>
#include <GLES/gl.h>
#include <GLES/egl.h>
#define MAX_LOADSTRING 100
#define PRECISION 16
#define ONE (1<<PRECISION)
#define ZERO 0
inline GLfixed FixedFromInt(int value){ return value<<PRECISION; }
bool InitOGLES();
void Render();
void Clean();
// 全局變數:
HINSTANCE g_hInst; // 當前實例
HWND g_hWndMenuBar; // 菜單欄句柄
HWND hWnd;
HDC hDc;
EGLDisplay glesDisplay;
EGLSurface glesSurface;
EGLContext glesContext;
TCHAR szTitle[MAX_LOADSTRING]; // 標題欄文本
TCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口類名
// 此代碼模塊中包含的函數的前向聲明:
ATOM MyRegisterClass(HINSTANCE, LPTSTR);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
// 執行應用程序初始化:
if (!InitInstance(hInstance, nCmdShow))
{
return FALSE;
}
HACCEL hAccelTable;
hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_HELLO));
/* 主消息循環:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}*/
bool done=false;
while(!done)
{
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
if(msg.message==WM_QUIT)
{
done=true;
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
else
{
Render();
}
}
Clean();
return (int) msg.wParam;
}
//
// 函數: MyRegisterClass()
//
// 目的: 注冊窗口類。
//
// 注釋:
//
ATOM MyRegisterClass(HINSTANCE hInstance, LPTSTR szWindowClass)
{
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_HELLO));
wc.hCursor = 0;
wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = 0;
wc.lpszClassName = szWindowClass;
return RegisterClass(&wc);
}
//
// 函數: InitInstance(HINSTANCE, int)
//
// 目的: 保存實例句柄並創建主窗口
//
// 注釋:
//
// 在此函數中,我們在全局變數中保存實例句柄並
// 創建和顯示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
g_hInst = hInstance; // 將實例句柄存儲在全局變數中
// 在應用程序初始化期間,應調用一次 SHInitExtraControls 以初始化
// 所有設備特定控制項,例如,CAPEDIT 和 SIPPREF。
SHInitExtraControls();
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_HELLO, szWindowClass, MAX_LOADSTRING);
//如果它已經在運行,則將焦點置於窗口上,然後退出
hWnd = FindWindow(szWindowClass, szTitle);
if (hWnd)
{
// 將焦點置於最前面的子窗口
// 「| 0x00000001」用於將所有附屬窗口置於前台並
// 激活這些窗口。
SetForegroundWindow((HWND)((ULONG) hWnd | 0x00000001));
return 0;
}
if (!MyRegisterClass(hInstance, szWindowClass))
{
return FALSE;
}
hWnd = CreateWindow(szWindowClass, szTitle, WS_VISIBLE,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
if (!hWnd)
{
return FALSE;
}
if(!InitOGLES())
return false;
// 使用 CW_USEDEFAULT 創建主窗口時,將不會考慮菜單欄的高度(如果創建了一個
// 菜單欄)。因此,我們要在創建窗口後調整其大小
// 如果菜單欄存在
if (g_hWndMenuBar)
{
RECT rc;
RECT rcMenuBar;
GetWindowRect(hWnd, &rc);
GetWindowRect(g_hWndMenuBar, &rcMenuBar);
rc.bottom -= (rcMenuBar.bottom - rcMenuBar.top);
MoveWindow(hWnd, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, FALSE);
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
//
// 函數: WndProc(HWND, UINT, WPARAM, LPARAM)
//
// 目的: 處理主窗口的消息。
//
// WM_COMMAND - 處理應用程序菜單
// WM_PAINT - 繪制主窗口
// WM_DESTROY - 發送退出消息並返回
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
static SHACTIVATEINFO s_sai;
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// 分析菜單選擇:
switch (wmId)
{
case IDM_HELP_ABOUT:
DialogBox(g_hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, About);
break;
case IDM_OK:
SendMessage (hWnd, WM_CLOSE, 0, 0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_CREATE:
SHMENUBARINFO mbi;
memset(&mbi, 0, sizeof(SHMENUBARINFO));
mbi.cbSize = sizeof(SHMENUBARINFO);
mbi.hwndParent = hWnd;
mbi.nToolBarId = IDR_MENU;
mbi.hInstRes = g_hInst;
if (!SHCreateMenuBar(&mbi))
{
g_hWndMenuBar = NULL;
}
else
{
g_hWndMenuBar = mbi.hwndMB;
}
// 初始化外殼程序激活信息結構
memset(&s_sai, 0, sizeof (s_sai));
s_sai.cbSize = sizeof (s_sai);
break;
case WM_PAINT:
ValidateRect(hWnd,NULL);
break;
case WM_DESTROY:
CommandBar_Destroy(g_hWndMenuBar);
PostQuitMessage(0);
break;
case WM_ACTIVATE:
// 向外殼程序通知我們的激活消息
SHHandleWMActivate(hWnd, wParam, lParam, &s_sai, FALSE);
break;
case WM_SETTINGCHANGE:
SHHandleWMSettingChange(hWnd, wParam, lParam, &s_sai);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
// 「關於」框的消息處理程序。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
{
// 創建一個「完成」按鈕並調整其大小。
SHINITDLGINFO shidi;
shidi.dwMask = SHIDIM_FLAGS;
shidi.dwFlags = SHIDIF_DONEBUTTON | SHIDIF_SIPDOWN | SHIDIF_SIZEDLGFULLSCREEN | SHIDIF_EMPTYMENU;
shidi.hDlg = hDlg;
SHInitDialog(&shidi);
}
return (INT_PTR)TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK)
{
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
break;
case WM_CLOSE:
EndDialog(hDlg, message);
return TRUE;
}
return (INT_PTR)FALSE;
}
bool InitOGLES()
{
EGLConfig configs[10];
EGLint matchingConfigs;
const EGLint configAttribs[]={
EGL_RED_SIZE, 8,
EGL_GREEN_SIZE, 8,
EGL_BLUE_SIZE, 8,
EGL_ALPHA_SIZE, EGL_DONT_CARE,
EGL_DEPTH_SIZE, 16,
EGL_STENCIL_SIZE,EGL_DONT_CARE,
EGL_SURFACE_TYPE,EGL_WINDOW_BIT,
EGL_NONE, EGL_NONE
};
hDc=GetWindowDC(hWnd);
glesDisplay=eglGetDisplay(hDc);
if(!eglInitialize(glesDisplay,NULL,NULL))
return false;
if(!eglChooseConfig(glesDisplay,configAttribs,&configs[0],10,&matchingConfigs))
return false;
if(matchingConfigs<1)
return false;
glesSurface=eglCreateWindowSurface(glesDisplay,configs[0],hWnd,configAttribs);
if(!glesSurface)
return false;
glesContext=eglCreateContext(glesDisplay,configs[0],0,configAttribs);
if(!glesContext)
return false;
eglMakeCurrent(glesDisplay,glesSurface,glesSurface,glesContext);
glClearColorx(0,0,0,0);
glShadeModel(GL_SMOOTH);
RECT r;
GetWindowRect(hWnd,&r);
glViewport(r.left,r.top,r.right-r.left,r.bottom-r.top);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrthox(FixedFromInt(-50),FixedFromInt(50),
FixedFromInt(-50),FixedFromInt(50),
FixedFromInt(-50),FixedFromInt(50));
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
return true;
}
void Render()
{
static int rotation=0;
GLshort vertexArray[9]={-25,-25,0, 25,-25,0, 0,25,0 };
GLubyte colorArray[12]={255,0,0,0, 0,255,0,0, 0,0,255,0 };
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatex(0,0,FixedFromInt(-10));
glRotatex(FixedFromInt(rotation++),0,ONE,0);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3,GL_SHORT,0,vertexArray);
glEnableClientState(GL_COLOR_ARRAY);
glColorPointer(4,GL_UNSIGNED_BYTE,0,colorArray);
glDrawArrays(GL_TRIANGLES,0,3);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
eglSwapBuffers(glesDisplay,glesSurface);
}
void Clean()
{
if(glesDisplay)
{
eglMakeCurrent(glesDisplay,NULL,NULL,NULL);
if(glesContext)
eglDestroyContext(glesDisplay,glesContext);
if(glesSurface)
eglDestroySurface(glesDisplay,glesSurface);
eglTerminate(glesDisplay);
}
DestroyWindow(hWnd);
UnregisterClass(szWindowClass,g_hInst);
}
5. 能給個用OpenGL編寫的源代碼嗎,大作業要用,最好300行以上,謝謝了
有沒有酬金啊? 100元就行.給你demo.
6. 求opengl 讀取、顯示 dem 的源代碼(高分獎勵、好的話再加分)
讀dem與三維顯示是兩碼事。
dem只含網格點上的數值。二進制文件。數據按地理上的行排列,第1行完了是第2行,第2行完了是第3行,...直到最後一行。
每個數是 short int, 也就是 16 bits (2個bytes).
dem 的 short int 是 big endian. 如果 在 PC 上使用,你要交換2個bytes的順序,例如依次讀入的 byte
byte1 byte2 byte3 byte4 byte5 byte6 。。。
你要兩兩交換成 byte2 byte1 byte4 byte3 byte6 byte5
再構成 short int,short int ,short int 。。。。
到底這個瓦片的地理數據有幾行幾列等等,你要下載它的 Header File (.HDR)
裡面有
BYTEORDER,LAYOUT,
NROWS, NCOLS,
NBANDS,NBITS, BANDROWBYTES,
TOTALROWBYTES,
BANDGAPBYTES, NODATA,
ULXMAP, ULYMAP,
XDIM, YDIM,
換算成 經緯度或投影成 x,y, 你需要 (.HDR)
OPENGL 畫 3 維圖很簡單,你有了 每行每列的xyz,很好畫。
7. OpenGL的實現源代碼,該如何解決
簡單的代碼你可以網上找.但是復雜的,特別的代碼,你只能花錢買.