请教关于OpenGL聚光灯的问题

zhouping200511638 zhouping200511638 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
代码如下:


class CBox
{
private:
int mWindowWidth;
int mWindowHeight;
float mAngle;
float s;
float c;
public:
CBox();
~CBox();

bool init();
bool ShutDown();

void SetProjection(int width, int height);
void Prepare(float fAngle);
void Render();
void Light();
};

float light[] = {1.0, 0.0, 0.0, 1.0};//灯光颜色
float position[] = {0.0, 1.0, 0.0, 1.0};//灯光位置,为点光源
float direction[] = {-1.0, -1.0, 0.0};//灯光方向

void CBox::Light()//设置灯光
{
glEnable(GL_LIGHTING);
glLightfv(GL_LIGHT0, GL_AMBIENT, light);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light);
glLightfv(GL_LIGHT0, GL_SPECULAR, light);
glLightfv(GL_LIGHT0, GL_POSITION, position);

glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, direction);
glLightf(GL_LIGHT0, GL_SPOT_EXPONENT, 0.0);
glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 30.0);

glEnable(GL_LIGHT0);
}

float material1[] = {0.0, 0.0, 0.0, 1.0};//材质1不反射任何颜色
float material2[] = {1.0, 1.0, 1.0, 1.0};//材质2反射所以颜色

float x = 1.0;

void CBox::Render()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
glLoadIdentity();
gluLookAt(2.0, -2.0, 0.0, -1.0, 1.0, 0.0, 0.0, 0.0, 1.0);

Light();

glMaterialfv(GL_FRONT,GL_AMBIENT, material1);
glMaterialfv(GL_FRONT, GL_DIFFUSE, material1);
glMaterialfv(GL_FRONT, GL_SPECULAR, material2);//使平面只有反射光

glBegin(GL_QUADS);//在X轴-1出垂直X轴画一个平面
glNormal3f(1.0, 0.0, 0.0);
glVertex3f(-x, x, x);
glVertex3f(-x, x, -x);
glVertex3f(-x, -x, -x);
glVertex3f(-x, -x, x);
glEnd();
}


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nShowCmd)
{
WNDCLASSEX windowClass;
HWND hwnd;
MSG msg;
DWORD dwExStyle;
DWORD dwStyle;
RECT windowRect;



windowRect.left = (long)0;
windowRect.right = (long)windowWidth;
windowRect.top = (long)0;
windowRect.bottom = (long)windowHeight;

memset(&windowClass, 0, sizeof(WNDCLASSEX));

windowClass.cbSize = sizeof(WNDCLASSEX);
windowClass.style = CS_HREDRAW | CS_VREDRAW;
windowClass.lpfnWndProc = MainWindowProc;
windowClass.cbClsExtra = 0;
windowClass.cbWndExtra = 0;
windowClass.hInstance = hInstance;
windowClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
windowClass.hCursor = LoadCursor(NULL, IDC_ARROW);
windowClass.hbrBackground = NULL;
windowClass.lpszClassName = "OpenGL";
windowClass.hIconSm = LoadIcon(NULL, IDI_WINLOGO);

if( !RegisterClassEx(&windowClass))
return 0;

dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;
dwStyle = WS_OVERLAPPEDWINDOW;

AdjustWindowRectEx(&windowRect, dwStyle, FALSE, dwExStyle);

hwnd = CreateWindowEx(NULL, "OpenGL",
"myOpenGL", dwStyle | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
0, 0,
windowRect.right - windowRect.left,
windowRect.bottom - windowRect.top,
NULL, NULL, hInstance, NULL);

hDC = GetDC(hwnd);
mBox = new CBox;

if( !hwnd )
return 0;

ShowWindow(hwnd, SW_SHOW);
UpdateWindow(hwnd);

mBox->init();

while( exiting )
{
mBox->Prepare(0.0f);
mBox->Render();
SwapBuffers(hDC);

while( PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) )
{
if( !GetMessage(&msg, NULL, 0, 0) )
{
// exiting = true;
break;
}

TranslateMessage(&msg);
DispatchMessage(&msg);
}
}

return (int)msg.wParam;
}


想实现的效果就像是一个手电筒照射到一个平面,出现一个圆形的光亮区,但是这个希望的效果一直没有出现。
1,当把聚光灯的角度调至小于30度时,突然变暗。
glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 30.0);
这是什么原因?
2,怎么才能实现手电筒的效果?


以下图片是程序输出:
...全文

相关推荐

评论 5
收藏 已收藏
分享
返回顶部
zhouping200511638
机器视觉 4,514 成员 15,347 内容