Unity

Texture

gcreators 2024. 10. 7. 17:56

텍스처(Texture)

3D 모델의 표면에 적용되는 2D 이미지로, 물체의 색상, 세부 사항, 패턴 등을 추가하여

풍부한 그래픽으로 보완해주는 역할을 가진다.

 

이미지 데이터 : 픽셀로 구성된 2D 이미지로, 색상 정보를 포함 함

 

UV : 3D 모델의 표면에 2D 텍스처를 매핑하는 데 사용되는 좌표 체계, U와 V는 텍스처의 수평과 수직 방향을 나타내며, 각각의 축이 0에서 1 사이의 값을 가진다.

UV 좌표는 텍스처와 3D 모델 간의 연결고리 역할을 함

※ U: 텍스처의 수평 위치 (0 = 왼쪽, 1 = 오른쪽)
    V: 텍스처의 수직 위치 (0 = 아래, 1 = 위)

 

예를 들어, (0, 0)은 텍스처의 왼쪽 아래 모서리를, (1, 1)은 오른쪽 위 모서리를 나타낸다.

 - UV매핑 : 3D 모델의 각 정점에 UV 좌표를 할당하여 텍스처의 특정 부분이 해당 정점에 적용되게끔 함

 

셰이더 : 텍스처와 함께 사용되어 물체의 시각적 표현을 조정함

조명 : 텍스처는 조명 효과와 함께 사용되어 물체가 어떻게 빛을 반사하고 보일지를 결정함

 

등 그래픽 처리에 관한 여러 특징을 지니고 있으며 이를 포괄적으로 통칭하는 것이 텍스쳐 라고 할 수 있다.

 

using System;
using UnityEngine;

public class HandmadeTim : MonoBehaviour
{
    private MeshFilter mf = null;
    private MeshRenderer mr = null; //MeshFilter와 MeshRenderer가 있어야 화면에 그릴 수 있음

    private void Awake()
    {
        mf = gameObject.AddComponent<MeshFilter>();
        mr = gameObject.AddComponent<MeshRenderer>();//두 컴포넌트 추가
    }

    private void Start()
    {
        Mesh mesh = BuildMesh();
        mf.mesh = mesh;

    }

    private Mesh BuildMesh() //Mesh Filter 만들기
    {
        Mesh mesh = new Mesh();
        mesh.name = "HandmadeQuad";

        Texture2D tex = Resources.Load<Texture2D>("Textures\\t_Texture_Braid_Tim");
        //Material mat = CreateMaterial(null);
        Material mat = CreateMaterial(tex);
        mr.material = mat;

        // 0 -- 1
        // |    |
        // 2 -- 3

        Vector3[] vertices = new Vector3[4]
        {
            new Vector3(-0.5f, 1f),
            new Vector3(0.5f, 1f),
            new Vector3(-0.5f, 0f),
            new Vector3(0.5f, 0f)
        };
        // vertex Buffer
        mesh.vertices = vertices; //vertices : mesh에 vertex정보(위치)를 배치하는 배열

        // CW(Clock - Wise)
        int[] indieces = new int[]
        {
            0,1,2,//시계방향
            1,3,2 //1,2,3 반시계방향
        };

        // Index Buffer
        mesh.triangles = indieces;

        Vector2[] uvs = new Vector2[] //texture를 받으려면 uv가 필요하다
        {
            //new Vector2(0f, 0f),
            //new Vector2(1f, 0f),
            //new Vector2(0f, 1f),
            //new Vector2(1f, 1f),
            new Vector2(0f, 1f),
            new Vector2(1f, 1f),
            new Vector2(0f, 0f),
            new Vector2(1f, 0f)
        };
        mesh.uv = uvs; //mesh의 각 정점에 대한 uv좌표를 담은 배열, Texture를 mesh에 매핑하는데 사용됨

        Vector3[] normals = new Vector3[4] //normal : 법선벡터, 조명계산엔 법선벡터가 필요하다.
        {
            new Vector3(0f, 0f, -1f),
            new Vector3(0f, 0f, -1f),
            new Vector3(0f, 0f, -1f),
            new Vector3(0f, 0f, -1f)
        };
        mesh.normals = normals;

        return mesh;
    }

    private Material CreateMaterial(Texture2D _tex)
    {
        Material mat = new Material(
            Shader.Find("Universal Render Pipeline/Lit")); //Material은 기본 생성자가 없다.(new Material() 은 빨간색 에러가 뜸)
                                                           //항상 특정한 셰이더를 지정해서 생성해야함.
                                                           //Material -> URP - Lit(조명처리) -> 유니티에서 기본적으로 설정되는 셰이더
        mat.name = "Unlit_Tim";

        mat.mainTexture = _tex;

        return mat;
    }
}

 

빈 object에 스크립트를 넣은 뒤 실행

 

빈 object에 메쉬 필터와 렌더러, material이 설정되는 것을 확인 할 수 있다

'Unity' 카테고리의 다른 글

UI - Canvas  (0) 2024.10.18
Lerp(선형 보간)  (0) 2024.10.01
Coroutine(코루틴)  (0) 2024.09.30
Prefab  (0) 2024.09.24
Collision(충돌)  (0) 2024.09.23