【libGDX】使用Mesh繪制矩形

1 前言

????????使用Mesh繪制三角形?中介紹了繪制三角形的方法,本文將介紹繪制正方形的方法。

? ? ? ? libGDX?以點、線段、三角形為圖元,沒有提供繪制矩形內部的接口。要繪制矩形內部,必須通過三角形拼接而成,如下圖,是通過GL_TRIANGLE_FAN 模式繪制矩形。

????????繪制的坐標點如下,屏幕中心為坐標原點,向右和向上分別為 x 軸和 y 軸正方向。

float[] vertices = {-0.5f, -0.5f, 0.0f, // 左下0.5f, -0.5f, 0.0f, // 右下0.5f, 0.5f, 0.0f, // 右上-0.5f, 0.5f, 0.0f // 左上
};

2 繪制矩形

????????DesktopLauncher.java

package com.zhyan8.game;import com.badlogic.gdx.backends.lwjgl3.Lwjgl3Application;
import com.badlogic.gdx.backends.lwjgl3.Lwjgl3ApplicationConfiguration;public class DesktopLauncher {public static void main (String[] arg) {Lwjgl3ApplicationConfiguration config = new Lwjgl3ApplicationConfiguration();config.setForegroundFPS(60);config.setTitle("Square");new Lwjgl3Application(new Square(), config);}
}

????????Square.java

package com.zhyan8.game;import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL30;
import com.badlogic.gdx.graphics.Mesh;
import com.badlogic.gdx.graphics.VertexAttribute;
import com.badlogic.gdx.graphics.VertexAttributes.Usage;
import com.badlogic.gdx.graphics.glutils.ShaderProgram;public class Square extends ApplicationAdapter {private ShaderProgram mShaderProgram;private Mesh mMesh;@Overridepublic void create() {initShader();initMesh();}@Overridepublic void render() {Gdx.gl.glClearColor(0.455f, 0.725f, 1.0f, 1.0f);Gdx.gl.glClear(GL30.GL_COLOR_BUFFER_BIT);mShaderProgram.bind();mMesh.render(mShaderProgram, GL30.GL_TRIANGLE_FAN);}@Overridepublic void dispose() {mShaderProgram.dispose();mMesh.dispose();}private void initShader() { // 初始化著色器程序String vertex = Gdx.files.internal("shaders/square_vertex.glsl").readString();String fragment = Gdx.files.internal("shaders/square_fragment.glsl").readString();mShaderProgram = new ShaderProgram(vertex, fragment);}private void initMesh() { // 初始化網格float[] vertices = {-0.5f, -0.5f, 0.0f, // 左下0.5f, -0.5f, 0.0f, // 右下0.5f, 0.5f, 0.0f, // 右上-0.5f, 0.5f, 0.0f // 左上};short[] indices = {0, 1, 2, 3};VertexAttribute vertexPosition = new VertexAttribute(Usage.Position, 3, "a_position");mMesh = new Mesh(true, vertices.length / 3, indices.length, vertexPosition);mMesh.setVertices(vertices);mMesh.setIndices(indices);}
}

????????square_vertex.glsl

#version 300 es
precision mediump float; // 聲明float型變量的精度為mediumpout vec4 fragColor;void main() {fragColor = vec4(1, 0, 0, 0);
}

????????square_fragment.glsl

#version 300 esin vec3 a_position;void main() {gl_Position = vec4(a_position, 1.0);
}

? ? ? ? 運行效果如下。

3 繪制正方形

????????Square.java

package com.zhyan8.game;import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL30;
import com.badlogic.gdx.graphics.Mesh;
import com.badlogic.gdx.graphics.VertexAttribute;
import com.badlogic.gdx.graphics.VertexAttributes.Usage;
import com.badlogic.gdx.graphics.glutils.ShaderProgram;public class Square extends ApplicationAdapter {private ShaderProgram mShaderProgram;private Mesh mMesh;private float mRatio;@Overridepublic void create() {initShader();initMesh();}@Overridepublic void render() {Gdx.gl.glClearColor(0.455f, 0.725f, 1.0f, 1.0f);Gdx.gl.glClear(GL30.GL_COLOR_BUFFER_BIT);mShaderProgram.bind();mShaderProgram.setUniformf("u_wh_ratio", mRatio);mMesh.render(mShaderProgram, GL30.GL_TRIANGLE_FAN);}@Overridepublic void dispose() {mShaderProgram.dispose();mMesh.dispose();}private void initShader() { // 初始化著色器程序String vertex = Gdx.files.internal("shaders/square_vertex.glsl").readString();String fragment = Gdx.files.internal("shaders/square_fragment.glsl").readString();mShaderProgram = new ShaderProgram(vertex, fragment);mRatio = 1.0f * Gdx.graphics.getWidth() / Gdx.graphics.getHeight();}private void initMesh() { // 初始化網格float[] vertices = {-0.5f, -0.5f, 0.0f, // 左下0.5f, -0.5f, 0.0f, // 右下0.5f, 0.5f, 0.0f, // 右上-0.5f, 0.5f, 0.0f // 左上};short[] indices = {0, 1, 2, 3};VertexAttribute vertexPosition = new VertexAttribute(Usage.Position, 3, "a_position");mMesh = new Mesh(true, vertices.length / 3, indices.length, vertexPosition);mMesh.setVertices(vertices);mMesh.setIndices(indices);}
}

????????square_vertex.glsl

#version 300 esin vec3 a_position;uniform float u_wh_ratio; // 屏幕寬高比void main() {gl_Position = vec4(a_position, 1.0);if (u_wh_ratio > 1.0) {gl_Position.x /= u_wh_ratio;} else {gl_Position.y *= u_wh_ratio;}
}

????????square_fragment.glsl

#version 300 es
precision mediump float; // 聲明float型變量的精度為mediumpout vec4 fragColor;void main() {fragColor = vec4(0, 1, 0, 0);
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/161918.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/161918.shtml
英文地址,請注明出處:http://en.pswp.cn/news/161918.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于JavaWeb+SSM+Vue家庭記賬本微信小程序系統的設計和實現

基于JavaWebSSMVue家庭記賬本微信小程序系統的設計和實現 源碼獲取入口前言主要技術系統設計功能截圖Lun文目錄訂閱經典源碼專欄Java項目精品實戰案例《500套》 源碼獲取 源碼獲取入口 前言 1.1選題背景 互聯網是人類的基本需求,特別是在現代社會,個人…

看不慣AI版權作品被白嫖!Stability AI副總裁選擇了辭職,曾領導開發Stable Audio

近日,OpenAI的各種大瓜真是讓人吃麻了。 而就在Sam Altmam被開除前兩天,可能沒太多人注意到Stability AI副總裁Newton—Rex因看不慣StabilityAI在版權保護上的行為選擇辭職一事。 大模型研究測試傳送門 GPT-4傳送門(免墻,可直接…

SPASS-聚類和判別分析

聚類與判別分析概述 基本概念 聚類分析 聚類分析的基本思想是找出一些能夠度量樣本或指標之間相似程度的統計量,以這些統計量為劃分類型的依據,把一些相似程度較大的樣本(或指標)聚合為一類,把另外一些彼此之間相似程…

C++那些事之string那些事

C那些事之string那些事 C11C17C20C23結論 當我們使用C時,庫的基礎知識比較熟悉,尤其是在C中創建字符串時使用的std::string。這無疑是對舊的C風格“字符串”(使用以空字符結尾的字符數組)的一種改進。然而,C標準庫在C1…

【Hello Go】Go語言網絡編程

Go語言網絡編程 Go語言程序服務端客戶端 Http程序 有關網絡的基本知識我之前的博客介紹的很詳細 這里就不再贅述了 這里主要講解下Go語言網絡編程的語法 網絡基礎 協議 Go語言程序 我們建立一個tcp鏈接的步驟為 socket bind listen accept 但是在Go語言中 我們并不需要前兩…

office word 使用筆記

office word 使用筆記 1. 功能1.1 格式快捷鍵1.2 復選框 2 遇到過的問題2.1 表格標題和表格距離過大 1. 功能 1.1 格式快捷鍵 復制格式:ctrl shift c 粘貼格式:ctrl shift v 1.2 復選框 方框位置和類型:“插入——高級符號——字體”選…

【追求卓越08】算法--排序算法

引導 今天開始介紹我們在工作中經常遇到的算法--排序。排序算法有很多,我們主要介紹以下幾種: 冒泡排序 插入排序 選擇排序 歸并排序 快速排序 計數排序 基數排序 桶排序 我們需要了解每一種算法的定義以及實現方式,并且掌握如何評…

LeetCode [簡單] 1. 兩數之和

給定一個整數數組 nums 和一個整數目標值 target,請你在該數組中找出 和為目標值 target 的那 兩個 整數,并返回它們的數組下標。 你可以假設每種輸入只會對應一個答案。但是,數組中同一個元素在答案里不能重復出現。 你可以按任意順序返回…

Leetcode——121 買賣股票的最佳時機

(超時。。。。。。&#xff09;除了暴力法我是真的。。。。。。 class Solution {public int maxProfit(int[] prices) {int len prices.length;int max0;for(int i0;i<len-1;i){for(int ji1;j<len;j){int income prices[j] - prices[i];if(income>max){maxincome;…

閃存組織結構概念

文章目錄 一、幾種不同類型閃存的參數&#xff1a;二、組織結構三、塊&#xff08;Block&#xff09;的結構擦除動作原理&#xff1a;寫操作讀操作 一、幾種不同類型閃存的參數&#xff1a; 參數項SLCMLCTLCQLC讀取時間/us20~2555~11075~170120~200寫入時間/us50~100400~15008…

Android設計模式--模板方法模式

一&#xff0c;定義 定義一個操作中的算法的框架&#xff0c;而將一些步驟延遲到子類中&#xff0c;使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。 在面向對象的開發過程中&#xff0c;通常會遇到這樣一個問題&#xff0c;我們知道一個算法所需的關鍵步…

MR導游情景英語虛擬仿真實訓系統應用

MR導游情景英語虛擬仿真實訓系統應運而生。系統旨在為學生提供一種全新的培訓方式。 系統采用先進的MR混合現實技術&#xff0c;通過虛擬現實技術創建逼真的旅游場景&#xff0c;讓學生能夠身臨其境地體驗各種旅游活動。學生可以在系統中扮演導游的角色&#xff0c;與其他同學…

docker報錯standard init linux.go:228 exec user process caused: exec format error

1、報錯 使用Dockerfile自己做的服務鏡像&#xff0c;docker run時啟動失敗&#xff0c;報錯如下&#xff1a; standard init linux.go:228 exec user process caused: exec format error2、原因一 當前服務器的CPU架構和構建鏡像時的CPU架構不兼容。比如做鏡像是在arm機器下…

競賽選題 車道線檢測(自動駕駛 機器視覺)

0 前言 無人駕駛技術是機器學習為主的一門前沿領域&#xff0c;在無人駕駛領域中機器學習的各種算法隨處可見&#xff0c;今天學長給大家介紹無人駕駛技術中的車道線檢測。 1 車道線檢測 在無人駕駛領域每一個任務都是相當復雜&#xff0c;看上去無從下手。那么面對這樣極其…

云原生正在重塑軟件的整個生命周期(內附資料)

隨著企業數字化轉型進程的發展&#xff0c;企業面臨著新舊商業形態的劇變&#xff0c;顛覆和重構時刻都在發生。 企業需要更加快速地感知用戶側的需求變化并做出調整&#xff0c;才有可能在競爭中持續積累優勢。業務的個性化、敏捷化、智能化需求日益突顯&#xff0c;數字化應…

git merge 和 git rebase

一、是什么 在使用 git 進行版本管理的項目中&#xff0c;當完成一個特性的開發并將其合并到 master 分支時&#xff0c;會有兩種方式&#xff1a; git merge git rebasegit rebase 與 git merge都有相同的作用&#xff0c;都是將一個分支的提交合并到另一分支上&#xff0c;…

模版模式 設計模式

設計模式 總目錄 https://preparedata.blog.csdn.net/article/details/134512591 文章目錄 設計模式 總目錄一、案例二、抽象類模版 AbstractOrderTemplate&#xff08;頂層的訂單抽象類&#xff09;三、執行模版的實現類3.1 默認執行模版 DefaultOrder3.2 其他執行模版 Simlp…

19.悲觀鎖與樂觀鎖解析

1.悲觀鎖 悲觀鎖比較悲觀&#xff0c;它認為如果不鎖住這個資源&#xff0c;別的線程就會來爭搶&#xff0c;就會造成數據結果錯誤&#xff0c;所以悲觀鎖為了確保結果的正確性&#xff0c;會在每次獲取并修改數據時&#xff0c;都把數據鎖住&#xff0c;讓其他線程無法訪問該…

2023年亞太地區數學建模大賽 問題B

玻璃溫室中的微氣候法規 溫室作物的產量受到各種氣候因素的影響&#xff0c;包括溫度、濕度和風速[1]。其中&#xff0c;適宜的溫度和風速是植物生長[2]的關鍵。為了調節玻璃溫室內的溫度、風速等氣候因素&#xff0c;溫室的設計通常采用帶有溫室風扇的通風系統&#xff0c;如…

docker報錯

安裝 docker報錯&#xff1a; Docker Desktop requires the Server service to be enabled. 解決方法&#xff1a; 管理員身份打開cmd&#xff0c;輸入&#xff1a; services.msc開啟 server 服務。 docker啟動報錯&#xff1a; 打開 docker 界面報錯&#xff1a; Docke…