国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

OpenGL —— 2.5、繪制第一個(gè)三角形(附源碼,glfw+glad)(更新:紋理貼圖)

這篇具有很好參考價(jià)值的文章主要介紹了OpenGL —— 2.5、繪制第一個(gè)三角形(附源碼,glfw+glad)(更新:紋理貼圖)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

源碼效果

OpenGL —— 2.5、繪制第一個(gè)三角形(附源碼,glfw+glad)(更新:紋理貼圖),OpenGL,OpenGL,C++
OpenGL —— 2.5、繪制第一個(gè)三角形(附源碼,glfw+glad)(更新:紋理貼圖),OpenGL,OpenGL,C++

?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-673126.html

C++源碼

?
?????紋理圖片
OpenGL —— 2.5、繪制第一個(gè)三角形(附源碼,glfw+glad)(更新:紋理貼圖),OpenGL,OpenGL,C++

?????
?????需下載stb_image.h這個(gè)解碼圖片的庫(kù),該庫(kù)只有一個(gè)頭文件。

OpenGL —— 2.5、繪制第一個(gè)三角形(附源碼,glfw+glad)(更新:紋理貼圖),OpenGL,OpenGL,C++
?
?????具體代碼:

??????????vertexShader.glsl

#version 330 core

layout(location = 0) in vec3 aPos;
layout(location = 1) in vec3 aColor;
layout(location = 2) in vec2 aUV;

out vec4 outColor;
out vec2 outUV;

void main()
{
	gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);
	outColor = vec4(aColor, 1.0);
	outUV = aUV;
}

?
??????????fragmentShader.glsl

#version 330 core

out vec4 FragColor;

in vec4 outColor;
in vec2 outUV;

uniform sampler2D ourTexture;

void main()
{
	// 使用色彩填充
	// FragColor = outColor;

	// 使用圖片紋理
	//FragColor = texture(ourTexture, outUV);

	// 使用圖片紋理及色彩混合
	FragColor = texture(ourTexture, outUV)*outColor;
}

?
??????????main.c

#include "OpenGLClass.h"

int main()
{
	OpenGLClass opengl;

	return 0;
}

?
??????????ffImage.h

#pragma once

#include "Global.h"

class ffImage
{
private:
	int m_width, m_height, m_picType;
	ffRGBA *m_data;

public:
	int getWidth()const;
	int getHeight()const;
	int getPicType()const;
	ffRGBA *getData()const;

	ffRGBA getColor(int x, int y)const;
	ffImage(int _width = 0, int _height = 0, int _picType = 0, ffRGBA *_data = nullptr);
	~ffImage();

	static ffImage *readFromFile(const char *_file_Name);
};

?
??????????ffImage.cpp

#include "ffImage.h"

#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h"

int ffImage::getWidth() const
{
	return m_width;
}

int ffImage::getHeight() const
{
	return m_height;
}

int ffImage::getPicType() const
{
	return m_picType;
}

ffRGBA *ffImage::getData() const
{
	return m_data;
}

ffRGBA ffImage::getColor(int x, int y) const
{
	if (x<0 || x>m_width - 1 || y<0 || y>m_height - 1) { return ffRGBA(0, 0, 0, 0); }
	
	return m_data[y*m_width + x];
}

ffImage::ffImage(int _width, int _height, int _picType, ffRGBA *_data)
{
	m_width = _width;
	m_height = _height;
	m_picType = _picType;

	int _sumSize = m_width * m_height;
	if (_data && _sumSize)
	{
		m_data = new ffRGBA[_sumSize];
		memcpy(m_data, _data, sizeof(ffRGBA)*_sumSize);
	}
	else
	{
		m_data = nullptr;
	}
}

ffImage::~ffImage()
{
	if (m_data) { delete[]m_data; }m_data = nullptr;
}

ffImage* ffImage::readFromFile(const char *_file_Name)
{
	int _width = 0, _height = 0, _picType = 0;

	// stbImage讀入的圖片是反的
	stbi_set_flip_vertically_on_load(true);

	unsigned char *bits = stbi_load(_file_Name, &_width, &_height, &_picType, STBI_rgb_alpha);
	ffImage *_image = new ffImage(_width, _height, _picType, (ffRGBA *)(bits));
	stbi_image_free(bits);

	return _image;
}

?
??????????OpenGLClass.h

#pragma once

#include "Global.h"
#include "ffImage.h"

class OpenGLClass
{
public:
	OpenGLClass();
	~OpenGLClass();

protected:
	// 初始化紋理
	bool initTexture();

	// 初始化模型VAO/VBO
	void initModel();

	// 初始化shader文件
	bool initShader(const char *_vertexPath, const char *_fragPath);

	// 讀取glsl文件內(nèi)容
	std::string ReadGlslContext(const char *sPath);

	// 刷新Render
	void FlushRender();

	// 回調(diào) - 窗口尺寸變化回調(diào)
	static void bck_GLFWframebuffersizefun(GLFWwindow* window, int width, int height);

	// 處理按鍵輸入
	void ProcessKeyPInput(GLFWwindow *window);

private:
	unsigned int shaderProgram = 0;		// 鏈接程序?qū)ο?/span>
	unsigned int VBO = 0, VAO = 0,_texture=0;
};

?
??????????OpenGLClass.cpp

#include "OpenGLClass.h"

void OpenGLClass::bck_GLFWframebuffersizefun(GLFWwindow* window, int width, int height)
{
	// 在窗口中定義一個(gè)像素矩形,最終的圖形將映射到個(gè)矩形中
	glViewport(0, 0, width, height);
}

OpenGLClass::OpenGLClass()
{
	// 初始化glfw上下文
	if (glfwInit() == GLFW_FALSE) { std::cout << "glfwInit fail!\n"; return; }
	glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);					// 3.3版本
	glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
	glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);	// 使用OpenGL核心模式

	// 創(chuàng)建OpenGL窗體
	GLFWwindow *window = glfwCreateWindow(800, 600, "OpenGL Core", nullptr, nullptr);
	if (!window) { std::cout << "glfwCreateWindow fail!\n"; return; }

	// 當(dāng)前OpenGL上下文綁定窗口
	glfwMakeContextCurrent(window);

	// 加載所有OpenGL函數(shù)指針
	if (GL_FALSE == gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) { std::cout << "gladLoadGLLoader fail!\n"; return; }

	// 在窗口中定義一個(gè)像素矩形,最終的圖形將映射到個(gè)矩形中
	glViewport(0, 0, 800, 600);

	// 窗口大小調(diào)整回調(diào)
	glfwSetFramebufferSizeCallback(window, OpenGLClass::bck_GLFWframebuffersizefun);

	// 初始化VAO/VBO
	initModel();

	// 初始化紋理
	if (!initTexture()) { std::cout << "initTexture fail!\n"; system("pause"); return; }

	// 初始化shader
	if (!initShader("vertexShader.glsl", "fragmentShader.glsl")) { std::cout << "initShader fail!\n"; system("pause"); return; }

	// 窗口標(biāo)志是否是關(guān)閉
	while (!glfwWindowShouldClose(window))
	{
		// 輸入按鍵處理
		ProcessKeyPInput(window);

		// 使用紅,綠,藍(lán)以及alpha值來(lái)清除顏色緩沖區(qū)
		glClearColor(0.328125f, 0.35156f, 0.82421f, 1.0f);

		// 將從窗口中清除最后一次所繪制的圖形
		/*
			GL_COLOR_BUFFER_BIT:    當(dāng)前可寫的顏色緩沖
			GL_DEPTH_BUFFER_BIT:    深度緩沖
			GL_ACCUM_BUFFER_BIT:	累積緩沖
  			GL_STENCIL_BUFFER_BIT:	模板緩沖
		*/
		glClear(GL_COLOR_BUFFER_BIT);

		FlushRender();

		// 雙緩沖,使用OpenGL或OpenGL ES進(jìn)行渲染
		glfwSwapBuffers(window);

		// glfw事件循環(huán)
		glfwPollEvents();

		// 睡眠10ms,防止造成GPU瘋狂消耗。實(shí)際具體調(diào)整
		Sleep(10);
	}

	// 釋放窗口
	glfwDestroyWindow(window);

	// 釋放資源,終止GLFW庫(kù)
	glfwTerminate();
}

OpenGLClass::~OpenGLClass()
{
	// 釋放
	if (glIsProgram(shaderProgram)) { glDeleteProgram(shaderProgram); }shaderProgram = 0;
	if (glIsBuffer(VAO)) { glDeleteBuffers(1, &VAO); } VAO = 0;
	if (glIsBuffer(VBO)) { glDeleteBuffers(1, &VBO); } VBO = 0;
}

void OpenGLClass::ProcessKeyPInput(GLFWwindow *window)
{
	if (window)
	{
		// 獲取窗口按鍵是否ESC
		if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
		{
			// 設(shè)置窗口關(guān)閉標(biāo)志
			glfwSetWindowShouldClose(window, true);
		}
	}
	window = nullptr;
}

void OpenGLClass::FlushRender()
{
	// 判斷VAO是否被刪除
	if (glIsVertexArray(VAO))
	{
		// 使用程序
		glUseProgram(shaderProgram);

		// 綁定紋理
		glBindTexture(GL_TEXTURE_2D, _texture);

		// 綁定VAO
		glBindVertexArray(VAO);

		// 繪制EBO索引
		glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);

		// 關(guān)閉使用程序
		glUseProgram(0);
	}
}

bool OpenGLClass::initTexture()
{
	// 讀取圖片相關(guān)信息
	ffImage *pImage = ffImage::readFromFile("./rec/wall.jpeg");
	if (!pImage) { return false; }

	// 生成紋理
	glGenTextures(1, &_texture);

	// 以2D方式綁定紋理
	// 將當(dāng)前綁定的紋理對(duì)象替換為參數(shù)中指定的紋理對(duì)象
	glBindTexture(GL_TEXTURE_2D, _texture);

	// 設(shè)置紋理屬性
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

	// 讀取圖片數(shù)據(jù),完成數(shù)據(jù)綁定
	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, pImage->getWidth(), pImage->getHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, pImage->getData());

	if (pImage) { delete pImage; }pImage = nullptr;
	return true;
}

void OpenGLClass::initModel()
{
	// 坐標(biāo)、顏色、紋理位置
	float vertices[]
	{
		0.5f,0.5f,0.0f,		1.0f,0.0f,0.0f,		 1.0f,1.0f,
		0.5f,-0.5f,0.0f,	0.0f,1.0f,0.0f,		 1.0f,0.0f,
		-0.5f,-0.5f,0.0f,	0.0f,0.0f,1.0f,		 0.0f,0.0f,
		-0.5f,0.5f,0.0f,	0.0f,1.0f,0.0f,		 0.0f,1.0f
	};

	// 索引數(shù)組
	unsigned int indices[]
	{
		0,1,2,
		1,2,3
	};

	/****************************************************/	// VAO
	// 創(chuàng)建VAO
	glGenVertexArrays(1, &VAO);

	// 綁定指定的頂點(diǎn)數(shù)組對(duì)象(Vertex Array Object, VAO)
	glBindVertexArray(VAO);
	/****************************************************/


	/****************************************************/	// EBO
	// EBO:索引緩沖對(duì)象,用來(lái)存放頂點(diǎn)索引數(shù)據(jù)
	unsigned int EBO = 0;
	glGenBuffers(1, &EBO);
	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
	glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
	/****************************************************/


	/****************************************************/	// VBO
	// 生成緩沖區(qū)對(duì)象
	glGenBuffers(1, &VBO);

	// 綁定命名緩沖區(qū)對(duì)象
	glBindBuffer(GL_ARRAY_BUFFER, VBO);

	// 緩沖對(duì)象(VBO,IBO 等)分配空間并存儲(chǔ)數(shù)據(jù)
	glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

	/*
		指定頂點(diǎn)屬性在頂點(diǎn)緩沖對(duì)象中的布局,并將其與頂點(diǎn)著色器中的頂點(diǎn)屬性進(jìn)行關(guān)聯(lián)
			參數(shù)1:第n個(gè)layout (對(duì)應(yīng)glsl中頂點(diǎn)著色器的layout)
			參數(shù)2:頂點(diǎn)屬性的組成元素的數(shù)量,例如3表示頂點(diǎn)屬性是由3個(gè)浮點(diǎn)數(shù)組成
			參數(shù)3:頂點(diǎn)屬性的數(shù)據(jù)類型
			參數(shù)4:是否將非浮點(diǎn)型的數(shù)據(jù)歸一化到[-1, 1]或[0, 1]范圍內(nèi)
			參數(shù)5:相鄰兩個(gè)頂點(diǎn)屬性之間的字節(jié)數(shù),通常為0或?qū)傩灶愋痛笮〕艘詳?shù)量
			參數(shù)6:頂點(diǎn)屬性在頂點(diǎn)緩沖對(duì)象中的偏移量或者數(shù)據(jù)的首地址
	*/
	glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void *)0);
	glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void *)(sizeof(float) * 3));
	glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void *)(sizeof(float) * 6));

	// 激活錨點(diǎn)(參數(shù):第n個(gè)layout)
	glEnableVertexAttribArray(0);
	glEnableVertexAttribArray(1);
	glEnableVertexAttribArray(2);

	// VBO解綁VAO
	glBindVertexArray(0);
	/****************************************************/
}

std::string OpenGLClass::ReadGlslContext(const char *sPath)
{
	std::string strContext;
	if (!sPath) { return strContext; }

	std::ifstream sFile;
	sFile.open(sPath);
	if (sFile.is_open())
	{
		std::stringstream sStream;
		sStream << sFile.rdbuf();
		strContext = sStream.str();
	}
	return strContext;
}

bool OpenGLClass::initShader(const char *_vertexPath, const char *_fragPath)
{
	char infoLog[512] = { 0 };
	int successFlag = 0;

	/*********************************************************/	// vertex編譯
	std::string vertexContext = ReadGlslContext(_vertexPath); if (vertexContext.empty()) { return false; }
	const char *cVertexContext = vertexContext.c_str();

	// 創(chuàng)建頂點(diǎn)著色器對(duì)象
	unsigned int iVertexID = glCreateShader(GL_VERTEX_SHADER);

	// 為頂點(diǎn)著色器指定源碼(參數(shù)2:傳過(guò)去幾個(gè))
	glShaderSource(iVertexID, 1, &cVertexContext, nullptr);

	// 編譯頂點(diǎn)著色器源碼
	glCompileShader(iVertexID);

	// 查看編譯頂點(diǎn)著色器源碼結(jié)果
	glGetShaderiv(iVertexID, GL_COMPILE_STATUS, &successFlag);
	if (!successFlag)	// 編譯失敗
	{
		// 獲取編譯失敗原因
		glGetShaderInfoLog(iVertexID, 512, nullptr, infoLog);
		std::cout << "glGetShaderiv GL_VERTEX_SHADER" << iVertexID << " fail:" << infoLog << std::endl; return false;
	}
	cVertexContext = nullptr;
	/*********************************************************/


	/*********************************************************/	// fragment編譯
	std::string fragmentContext = ReadGlslContext(_fragPath); if (fragmentContext.empty()) { return false; }
	const char *cFragmentContext = fragmentContext.c_str();

	// 創(chuàng)建片段著色器對(duì)象
	unsigned int iFragmentID = glCreateShader(GL_FRAGMENT_SHADER);

	// 為片段著色器指定源碼(參數(shù)2:傳過(guò)去幾個(gè))
	glShaderSource(iFragmentID, 1, &cFragmentContext, nullptr);

	// 編譯片段著色器源碼
	glCompileShader(iFragmentID);

	// 查看編譯片段著色器源碼結(jié)果
	glGetShaderiv(iFragmentID, GL_COMPILE_STATUS, &successFlag);
	if (!successFlag)	// 編譯失敗
	{
		// 獲取編譯失敗原因
		glGetShaderInfoLog(iFragmentID, 512, nullptr, infoLog);
		std::cout << "glGetShaderiv GL_FRAGMENT_SHADER" << iFragmentID << " fail:" << infoLog << std::endl; return false;
	}
	cFragmentContext = nullptr;
	/*********************************************************/


	/*********************************************************/	// 鏈接
	// 創(chuàng)建一個(gè)空的程序?qū)ο?/span>
	shaderProgram = glCreateProgram();
	if (shaderProgram == 0) { std::cout << "glCreateProgram fail!\n"; return false; }

	// 將著色器對(duì)象附加到程序?qū)ο笊希ㄗ?glDetachShader為移除程序?qū)ο笾械闹付ㄖ鲗?duì)象)
	glAttachShader(shaderProgram, iVertexID);
	glAttachShader(shaderProgram, iFragmentID);

	// 進(jìn)行鏈接程序?qū)ο?/span>
	glLinkProgram(shaderProgram);

	// 查看鏈接狀態(tài)
	glGetProgramiv(shaderProgram, GL_LINK_STATUS, &successFlag);
	if (!successFlag)	// 鏈接失敗
	{
		// 獲取鏈接失敗原因
		glGetProgramInfoLog(shaderProgram, 512, nullptr, infoLog);
		std::cout << "glGetProgramiv " << shaderProgram << " fail:" << infoLog << std::endl; return false;
	}
	/*********************************************************/


	/* 在鏈接完成后,將編譯shader相關(guān)刪除。僅留下鏈接ID */
	if (glIsShader(iVertexID)) { glDeleteShader(iVertexID); }
	if (glIsShader(iFragmentID)) { glDeleteShader(iFragmentID); }
	return true;
}

?

關(guān)注

Wx GZH:碼農(nóng)總動(dòng)員

筆者 - jxd

?

到了這里,關(guān)于OpenGL —— 2.5、繪制第一個(gè)三角形(附源碼,glfw+glad)(更新:紋理貼圖)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • OpenGL入門教程之 三角形練習(xí)

    ?本文章被包含在OpenGL學(xué)習(xí)專欄中。 ?本練習(xí)基于OpenGL繪制三角形中繪制三角形的代碼程序。 ?1.繪制兩個(gè)彼此相連的三角形。 ?2.創(chuàng)建相同的兩個(gè)三角形,對(duì)它們的數(shù)據(jù)使用不同的VAO和VBO。 ?3.創(chuàng)建兩個(gè)著色器程序。使用兩個(gè)著色器程序分別繪制出一個(gè)綠色三角形和黃色三

    2023年04月21日
    瀏覽(25)
  • chatgpt生成pygame opengl實(shí)現(xiàn)旋轉(zhuǎn)用圖片填充的3d三角形
  • 一起學(xué) WebGL:繪制三角形

    一起學(xué) WebGL:繪制三角形

    大家好,我是前端西瓜哥。畫了好幾節(jié)課的點(diǎn),這次我們來(lái)畫三角形了。 三角形可太重要了,再?gòu)?fù)雜的三維模型都是由一個(gè)個(gè)小三角形組合而成,越多越精細(xì)越真實(shí)。 這次繪制三角形,要繪制的點(diǎn)就有三個(gè)了,不再是一個(gè)。為此我們需要用到緩存區(qū)對(duì)象(buffer object)。 通過(guò)

    2023年04月18日
    瀏覽(24)
  • 前端開發(fā)必備技能!用簡(jiǎn)單CSS代碼繪制三角形,提升用戶體驗(yàn)

    前端開發(fā)必備技能!用簡(jiǎn)單CSS代碼繪制三角形,提升用戶體驗(yàn)

    ?? ????江城開朗的豌豆 :個(gè)人主頁(yè) ????個(gè)人專欄? :《 VUE 》?《 javaScript 》 ??? ?個(gè)人網(wǎng)站? :《 江城開朗的豌豆?? 》? ???生活的理想,就是為了理想的生活?! 目錄 ??? 專欄簡(jiǎn)介 ???? 文章引言 一、前言 二、實(shí)現(xiàn)過(guò)程 三、原理分析 ?? 寫在最后 ????????歡

    2024年02月07日
    瀏覽(96)
  • OpenCV項(xiàng)目開發(fā)實(shí)戰(zhàn)-- 將一個(gè)三角形變形為另一個(gè)三角形 ( C++ / Python )代碼實(shí)現(xiàn)

    OpenCV項(xiàng)目開發(fā)實(shí)戰(zhàn)-- 將一個(gè)三角形變形為另一個(gè)三角形 ( C++ / Python )代碼實(shí)現(xiàn)

    ?文末附基于Python和C++兩種方式實(shí)現(xiàn)的測(cè)試代碼下載鏈接 圖 1:左圖中藍(lán)色三角形內(nèi)的所有像素都已轉(zhuǎn)換為右圖中的藍(lán)色三角形。 在本教程中,我們將看到如何將圖像中的單個(gè)三角形變形為不同圖像中的另一個(gè)三角形。 在計(jì)算機(jī)圖形學(xué)中,人們一直在處理扭曲三角形,因?yàn)槿?/p>

    2024年02月09日
    瀏覽(30)
  • C語(yǔ)言程序設(shè)計(jì):輸入一個(gè)三角形的三條邊長(zhǎng),求出三角形的面積。

    C語(yǔ)言程序設(shè)計(jì):輸入一個(gè)三角形的三條邊長(zhǎng),求出三角形的面積。

    已知三角形的三邊長(zhǎng)a,b,c,則該三角形的面積公式為: ? ? ? ? ? area= ?其中s = (a+b+c)/2

    2024年02月06日
    瀏覽(31)
  • 如何用css畫一個(gè)三角形?

    要使用CSS顯示一個(gè)三角形,你可以利用元素的邊框?qū)傩院统叽缯{(diào)整來(lái)實(shí)現(xiàn)。下面是一種常用的方法: HTML: CSS: 在上面的示例中,我們創(chuàng)建了一個(gè)帶有類名 .triangle 的 div 元素。通過(guò)設(shè)置寬度和高度為0,我們創(chuàng)建了一個(gè)沒有實(shí)際內(nèi)容的空元素。然后,通過(guò)設(shè)置邊框?qū)傩?,我們?/p>

    2024年02月12日
    瀏覽(21)
  • PCL 計(jì)算一個(gè)平面與一個(gè)三角形的交線

    這里實(shí)現(xiàn)一個(gè)很有趣的功能,就是獲取一個(gè)平面與一個(gè)三角形的交線,具體的思路很簡(jiǎn)單,就是借助之前的博客中的思路:Matlab 計(jì)算一個(gè)平面與一條線段的交點(diǎn),我們只需要遍歷三角形中的所有邊即可獲取我們想要的交線,這里是PCL版本。

    2024年02月06日
    瀏覽(28)
  • css實(shí)現(xiàn)卡片的左上角有一個(gè)三角形的遮蓋效果

    css實(shí)現(xiàn)卡片的左上角有一個(gè)三角形的遮蓋效果

    需求: 卡片的左上角有一個(gè)綠色的三角形標(biāo)簽,用來(lái)區(qū)分狀態(tài) 實(shí)現(xiàn):

    2024年02月14日
    瀏覽(91)
  • css基礎(chǔ)知識(shí)十八:CSS如何畫一個(gè)三角形?原理是什么?

    css基礎(chǔ)知識(shí)十八:CSS如何畫一個(gè)三角形?原理是什么?

    一、前言 在前端開發(fā)的時(shí)候,我們有時(shí)候會(huì)需要用到一個(gè)三角形的形狀,比如地址選擇或者播放器里面播放按鈕 通常情況下,我們會(huì)使用圖片或者svg去完成三角形效果圖,但如果單純使用css如何完成一個(gè)三角形呢? 實(shí)現(xiàn)過(guò)程似乎也并不困難,通過(guò)邊框就可完成 二、實(shí)現(xiàn)過(guò)程

    2024年02月13日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包