Skip to content
Snippets Groups Projects
Select Git revision
  • 41771aa81124b3ae424d40d275403fe55a930db5
  • master default
2 results

function.py

Blame
  • index.html 6.56 KiB
    <html>
    
    <head>
    <title>WebGL Tutorial Page</title>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <script type="text/javascript" src="gl-matrix.js"> </script>
    <script type="text/javascript" src="script.js"> </script>
    <style>
        .title {
                background-color: rgb(71, 230, 8);
                color: black;
                cursor: none;
                padding: 18px;
                width: 100%;
                border: none;
                text-align: left;
                outline: none;
                font-size: 15px;
            }
        .title2 {
                background-color: rgb(12, 201, 248);
                color: black;
                cursor: none;
                padding: 18px;
                width: 100%;
                border: left;
                outline: none;
                font-size: 15px;
            }
        .title3 {
                background-color: rgb(255, 230, 6);
                color: black;
                cursor: none;
                padding: 18px;
                width: 100%;
                border: left;
                outline: none;
                font-size: 15px;
            }
    </style>
    
    </head>
    <h1>
        WebGL Tutorial : Texture Mapping 
    </h1>
    <div>
        <p>
            <strong>프로젝트를 시작하기 전</strong>
        </p>
        <p>
            <span>준비물 : Web Server for Chrome</span>
        </p>
        <p>
            <img src = "/data/Web.png" width= "800">
        </p>
        <p>이미지 파일을 Local 에서 보안상의 이유로 사용하지 못하도록 막아놓았기 때문에,</p>
        <p>Chrome Web Server를 Chrome Web Store에서 검색 후 실행시켜서 실행하고자 하는 폴더를 launch합니다.</p>
        <p>
            <img src = "/data/chrome.png" width= "500">
        </p>
        <p>그 후에 화면에 나와있는 로컬 주소를 클릭하여 실행 시킵니다.</p>
    </div>
    <div>
        <p class = "title">
            큐브의 각 면에 사진 텍스쳐를 입혀 보겠습니다.
        </p>
        <strong>텍스쳐 로딩</strong>
        <p>가장 먼저 해야할 일은 텍스쳐를 읽어오는 것입니다.</p>
        <p> 이번 예제에서는 동일한 하나의 텍스쳐를 회전하는 정육면체의 6개의 면에 입혀볼 것입니다. </p>
        <p>여러개의 텍스쳐를 각 면에 입힌다고 해도 하나를 입히는 것과 동일한 방법을 적용하면 됩니다.</p>
        <p>텍스쳐를 읽어오는 코드는 다음과 같습니다:</p>
        <p>
            <img src = "/data/initTexture.png" width = "700">
        </p>
        <p>initTextures() 루틴은 GL의 createTexture() 함수를 호출해서 GL의 텍스쳐 객체인 cubeTexture를 생성하는 걸로 시작됩니다.</p>
        <p>그리고 Image 객체를 생성해서 텍스쳐로 사용하기 위해 로딩한 이미지 파일을 Image 객체에 저장합니다.</p>
        <p>handleTextureLoaded()  콜백 루틴은 이미지 로딩이 완료되면 실행됩니다.</p>
        <p>텍스쳐를 실질적으로 생성하려면, 앞에서 새로 생성한 텍스쳐 객체를 gl.TEXTURE_2D에 바인딩해야 합니다.</p>
        <p>그리고 나서 이미지 데이터가 로딩된 이미지 객체를 texImage2D()에 전달하여 호출하면, 이미지 데이터가 텍스쳐에 쓰여(write) 집니다.</p>
        <p>그 다음 두 라인은 텍스쳐를 위한 필터링을 준비합니다.</p>
        <p>이 필터링은 이미지 크기가 변경될 때 이미지가 필터되는 방식을 제어합니다.</p>
        <p>여기에서는 이미지를 확대할 때 선형 필터링을 사용하고, 이미지를 축소할 때 mipmap을 사용합니다.</p>
        <p>generateMipMap()을 호출해서 mipmap이 만들어지면 gl.TEXTURE_2D에 null을 바인딩시켜서, 텍스쳐를 다룰 준비가 끝났다는 것을 WebGL에게 알려줍니다.</p>
        <strong>면에 텍스쳐 입히기</strong>
        <p>이제 텍스쳐 읽어오기는 완료되었고, 텍스쳐도 사용할 준비가 되어 있습니다.</p>
        <p>하지만 텍스쳐를 사용하기 전에 텍스쳐의 좌표와 정육면체의 면의 정점을 매핑 시켜줘야 합니다.</p>
        <p>이를 위해 initBuffers() 함수 안에 있던 정육면체 각 면의 색상을 설정하는 내용을 모두 아래와 같은 코드로 대체합니다.</p>
        <p>
            <img src = "/data/textureCoordinates.png" width = "700">
        </p>
        <strong>셰이더 수정</strong>
        <p>셰이더 프로그램과 셰이더를 초기화하는 코드들도 단색 색상 대신 텍스쳐를 사용할 수 있도록 수정해야 합니다.먼저 initShaders() 안에 있는 아주 단순한 변경 사항을 알아 봅시다:</p>
        <p>
            <img src = "/data/initshader.png" width = "700">
        </p>
        <strong>정점 셰이더</strong>
        <p>다음으로 색상 데이터를 읽어오던 정점 셰이더를 텍스쳐 좌표를 읽어오도록 수정해야 합니다.</p>
        <p>
            <img src = "/data/shader.png" width = "700">
        </p>
        <strong>프레그먼트 셰이더</strong>
        <p>마찬가지로 프래그먼트 셰이더도 수정해야 합니다:</p>
        <p>
            <img src = "data/fragshader.png" width = "700">
        </p>
    </div>
    <div>
        <p class = "title2">
            큐브를 마우스로 컨트롤 하는 기능을 추가해 보겠습니다.  
        </p>
        <p>
        <img src="/data/mouse.gif" width="700">
        </p>
        <strong>An Example Handler</strong>
        <p>아래의 예시는 onmousemove 캔버스 요소 내부의 이벤트에 대한 예제 핸들러입니다.</p>
        <p>마우스 이전 위치에서 오프셋을 계산하고 해당 오프셋을 사용하여 장면의 회전 각도를 수정합니다.</p>
        <p>
            <img src = "/data/mouse.png" width="500">
        </p>
        <p>마우스 wheel로 zoom을 당겼다가 풀었다가 하는 방법입니다.</p>
        <p>
            <img src = "/data/wheel.png" width="500">
        </p>
    </div>
    <div>
        <p class = "title3">
            앞서 다뤘던 내용들을 적용해보겠습니다.
        </p>
        <p>우선 이미지를 선택해서 Texture Mapping 해봅시다.</p>
        <p>*주의* 반드시 data 폴더 안에 사진을 넣고 그 사진 중에서 골라야 합니다. 사진 크기는 128x128 픽셀입니다.</p>
        <p>원하는 사진을 폴더 내에서 선택하여 주십시오.</p>
        <label align="left" for="userImage"><i class="fa fa-file-image"><span class="fa-icon-innter-text">&ensp;Upload 할 이미지를 선택하세요. (PNG, JPG)</span></i></label>
        <input type="file" id="userImage" accept=".jpg, .jpeg, .png">
    </div>
    
    <body onload="main()">
        <canvas id="helloapicanvas" style="border: none;" width="800" height="600"></canvas>
    	
    	<br/> <br/>
    <button onclick="toggleAnimation()">시작</button>
    <button onclick="speed_scale(1.1)"> + </button>
    <button onclick="speed_scale(0.9)"> - </button>
    
    </body>
    
    
    
    </html>