[英]OpenGL - Maintain texture width to height ratio
我有一個256x256的條板箱紋理和一個平面,只要高度高一倍。
我想保持紋理的縱橫比並控制其縮放比例,而不是將其拉伸到所有角,如下所示。
這是我的對象數據:
// Vertex Positions
Vector3 vertices = new Vector3[] {
new Vector3( 1, 0, 1),
new Vector3( 3, 0, 1),
new Vector3( 3, 1, 1),
new Vector3( 1, 1, 1)};
// Index Order
int[] indices = new int[] {0, 1, 2, 0, 2, 3};
// Texture Co-ordinates
Vector2 texcoords = new Vector2[] {
new Vector2 (0.0f, 0.0f),
new Vector2 (1.0f, 0.0f),
new Vector2 (1.0f, 1.0f),
new Vector2 (0.0f, 1.0f)};
// Normals
Vector3 normals = new Vector3[] {
new Vector3 (0.0f, 0.0f, 1.0f),
new Vector3 (0.0f, 0.0f, 1.0f),
new Vector3 (0.0f, 0.0f, 1.0f),
new Vector3 (0.0f, 0.0f, 1.0f)};
我已啟用紋理重復,並具有以下內容:
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, Convert.ToInt32(TextureWrapMode.Repeat));
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, Convert.ToInt32(TextureWrapMode.Repeat));
通過將紋理坐標與平面的高度和寬度匹配,紋理確實可以按預期重復。
// Texture Co-ordinates
Vector2 texcoords = new Vector2[] {
new Vector2 (0.0f, 0.0f),
new Vector2 (2.0f, 0.0f),
new Vector2 (2.0f, 1.0f),
new Vector2 (0.0f, 1.0f)};
但是,無論平面大小如何,我都希望所有256x256紋理都顯示一致的大小。
根據長寬比調整紋理坐標。
例如,如果您的圖塊的寬高比為2:1,則紋理坐標在X上的范圍為0-2,而不是0-1。 這將導致紋理在X中平鋪兩次。
您需要檢查X是否大於Y,反之亦然。 如果是前者,則按quadWidth / quadHeight縮放X。 否則,按quadHeight / quadWidth縮放texCoord.y。
這樣,您的最小尺寸將從0-1開始,較大的尺寸將進行調整以匹配您的紋理外觀。
您可以只將紋理的寬度和高度(或縱橫比,但是寬度和高度有時很有用,所以我只是將它們分別以float2形式分別作為x和y發送給着色器),然后進行校正那里。
OP的其他評論:
這工作了。 通過計算平面的寬度(x2 - x1)
和紋理偏移量(x1 % 1)
,紋理現在與“世界網格”水平對齊。
// Texture Co-ordinates
Vector2 texcoords = new Vector2[] {
new Vector2 (TextureOffset, 0.0f),
new Vector2 (TextureOffset + Width, 0.0f),
new Vector2 (TextureOffset + Width, 1.0f),
new Vector2 (TextureOffset, 1.0f)};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.