ゼロからOpenGL ESの4つの補遺を学びます.setupView書き直します.
5022 ワード
私はゼロからOpenGL ESの4つを学びます。にいます 一つの文には普通のGlifloat配列が使われています.OpenGLで定義されていないデータ構造を使用していないので、最も一般的で便利な方法です. ここでは第一部分で定義されているVerstex 3 Dを使って、 Vector 3 Dと Color 3 Dデータ構造が書き換えられました. セットビュー:方法.この方法が「より良い」というわけではないですが、それは違う方法です.OpenGLを初めて勉強したとき、頂点、色、三角形の用語は可変長浮動点配列よりも分かりやすいことが分かりました.あなたが私と同じなら、このバージョンが分かりやすいと思います. カスタムデータ構造を使う以外に、環境光要素の数を減らして、光源を右に少し移動しました.そしてVector 3 DCMake WithStartAndEnd Pointsを使って移動する光源を20面体に向ける.こうすると光の効果がもっと生き生きとします.
-(void)setupView:(GLView*)view
{ const GLfloat zNear = 0.01, zFar = 1000.0, fieldOfView = 45.0; GLfloat size; glEnable(GL_DEPTH_TEST); glMatrixMode(GL_PROJECTION); size = zNear * tanf(DEGREES_TO_RADIANS(fieldOfView) / 2.0); CGRect rect = view.bounds; glFrustumf(-size, size, -size / (rect.size.width / rect.size.height), size / (rect.size.width / rect.size.height), zNear, zFar); glViewport(0, 0, rect.size.width, rect.size.height); glMatrixMode(GL_MODELVIEW); // Enable lighting glEnable(GL_LIGHTING); // Turn the first light on glEnable(GL_LIGHT0); // Define the ambient component of the first light static const Color3D light0Ambient[] = {{0.05, 0.05, 0.05, 1.0}}; glLightfv(GL_LIGHT0, GL_AMBIENT, (const GLfloat *)light0Ambient); // Define the diffuse component of the first light static const Color3D light0Diffuse[] = {{0.4, 0.4, 0.4, 1.0}}; glLightfv(GL_LIGHT0, GL_DIFFUSE, (const GLfloat *)light0Diffuse); // Define the specular component and shininess of the first light static const Color3D light0Specular[] = {{0.7, 0.7, 0.7, 1.0}}; glLightfv(GL_LIGHT0, GL_SPECULAR, (const GLfloat *)light0Specular); glLightf(GL_LIGHT0, GL_SHININESS, 0.4); // Define the position of the first light // const GLfloat light0Position[] = {10.0, 10.0, 10.0}; static const Vertex3D light0Position[] = {{10.0, 10.0, 10.0}}; glLightfv(GL_LIGHT0, GL_POSITION, (const GLfloat *)light0Position); // Calculate light vector so it points at the object static const Vertex3D objectPoint[] = {{0.0, 0.0, -3.0}}; const Vertex3D lightVector = Vector3DMakeWithStartAndEndPoints(light0Position[0], objectPoint[0]); glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, (GLfloat *)&lightVector); // Define a cutoff angle. This defines a 50° field of vision, since the cutoff // is number of degrees to each side of an imaginary line drawn from the light's // position along the vector supplied in GL_SPOT_DIRECTION above glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 25.0); glLoadIdentity(); glClearColor(0.0f, 0.0f, 0.0f, 1.0f); }
光の属性を自由に調整して、余分な光源や二十面体を追加して、これらの調整がシーンにどのような変化をもたらすかを体験してください.これらは経験しにくいものですから、一晩ですべてを理解することは期待しないでください.