当前位置: 首页 > news >正文

西安市城乡建设管理局网站的公示栏6网页开发工具

西安市城乡建设管理局网站的公示栏6,网页开发工具,外国语学院英文网站建设,广告创意设计视频NormalMap-Online (cpetry.github.io)https://cpetry.github.io/NormalMap-Online/ CompNormalMap 将灰度图像转换为法线贴图 将灰度图像转换为法线贴图是一种常见的技术,用于在实时图形渲染中增加表面细节。下面是一个简单的方法来将灰度图像转换为法线贴图&…

NormalMap-Online (cpetry.github.io)https://cpetry.github.io/NormalMap-Online/

CompNormalMap

将灰度图像转换为法线贴图

将灰度图像转换为法线贴图是一种常见的技术,用于在实时图形渲染中增加表面细节。下面是一个简单的方法来将灰度图像转换为法线贴图:

  1. 加载灰度图像,并将其转换为浮点数值范围[0, 1]。

  2. 对于每个像素,计算其相邻像素与其距离,并计算它们之间的斜率。这可以通过使用Sobel算子或其他边缘检测算法来完成。

  3. 将每个像素的斜率向量归一化为单位长度,并转换为范围[-1, 1]内的值。

  4. 将每个像素的斜率向量转换为法线向量。法线向量可以通过使用以下公式计算得出:$normal = (2R - 1, 2G - 1, B)$,其中R,G和B分别是像素的红、绿和蓝通道值。由于我们的灰度图像没有颜色信息,我们可以将R,G和B设置为0.5,以得到一个朝向Z轴正方向的法线。

  5. 存储每个像素的法线向量作为输出法线贴图。

需要注意的是,这个简单的方法只能生成表面细节的近似值,并且可能会在处理像素边缘和细节时出现不准确的结果。更复杂的技术可以使用高斯过滤和其他方法来平滑法线图并产生更精细的结果。

Input:

Expect:

Output:

 

struct CompNormalMap : INode {virtual void apply() override {auto image = get_input<PrimitiveObject>("image");auto &ud = image->userData();int w = ud.get2<int>("w");int h = ud.get2<int>("h");using normal =  std::tuple<float, float, float>;normal n = {0, 0, 1};float n0 = std::get<0>(n);float n1 = std::get<1>(n);float n2 = std::get<2>(n);std::vector<normal> normalmap;normalmap.resize(image->size());float gx = 0;float gy = 0;float gz = 1;for (int i = 0; i < h; i++) {for (int j = 0; j < w; j++) {int idx = i * w + j;if (i == 0 || i == h || j == 0 || j == w) {normalmap[idx] = {0, 0, 1};}}}for (int i = 1; i < h-1; i++) {for (int j = 1; j < w-1; j++) {int idx = i * w + j;gx = (image->verts[idx+1][0] - image->verts[idx-1][0]) / 2.0f * 255;gy = (image->verts[idx+w][0] - image->verts[idx-w][0]) / 2.0f * 255;// 归一化法线向量float len = sqrt(gx * gx + gy * gy + gz * gz);gx /= len;gy /= len;gz /= len;// 计算光照值gx = 0.5f * (gx + 1.0f) ;gy = 0.5f * (gy + 1.0f) ;gz = 0.5f * (gz + 1.0f) ;normalmap[i * w + j] = {gx,gy,gz};}}for (int i = 0; i < h; i++) {for (int j = 0; j < w; j++) {int idx = i * w + j;image->verts[i * w + j][0] = std::get<0>(normalmap[i * w + j]);image->verts[i * w + j][1] = std::get<1>(normalmap[i * w + j]);image->verts[i * w + j][2] = std::get<2>(normalmap[i * w + j]);}}set_output("image", image);}
};
ZENDEFNODE(CompNormalMap, {{{"image"}},{{"image"}},{},{ "comp" },
});

cv

#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main()
{Mat grayImage = imread("gray_image.png", IMREAD_GRAYSCALE);if (grayImage.empty()){cerr << "Could not read input image" << endl;return -1;}Mat normalMap(grayImage.size(), CV_8UC3);for (int i = 1; i < grayImage.rows - 1; i++){for (int j = 1; j < grayImage.cols - 1; j++){double dx = grayImage.at<uchar>(i, j + 1) - grayImage.at<uchar>(i, j - 1);double dy = grayImage.at<uchar>(i + 1, j) - grayImage.at<uchar>(i - 1, j);Vec3b normal(dx, dy, 255);normalize(normal, normal);normalMap.at<Vec3b>(i, j) = normal * 127.5 + Vec3b(127.5, 127.5, 127.5);}}imwrite("normal_map.png", normalMap);return 0;
}

不调库

#include <iostream>
#include <fstream>
#include <cmath>using namespace std;int main() {// 读取灰度图ifstream input("input.bmp", ios::binary);if (!input) {cout << "无法打开文件" << endl;return 1;}char header[54];input.read(header, 54);int width = *(int*)(header + 18);int height = *(int*)(header + 22);int row_size = (width * 24 + 31) / 32 * 4;char* data = new char[row_size * height];input.read(data, row_size * height);input.close();// 计算法线图char* output = new char[row_size * height];for (int y = 1; y < height - 1; y++) {for (int x = 1; x < width - 1; x++) {// 计算梯度double dx = (data[(y + 1) * row_size + (x + 1) * 3] - data[(y - 1) * row_size + (x - 1) * 3]) / 255.0;double dy = (data[(y - 1) * row_size + (x + 1) * 3] - data[(y + 1) * row_size + (x - 1) * 3]) / 255.0;double dz = 1.0;// 归一化法线向量double length = sqrt(dx * dx + dy * dy + dz * dz);dx /= length;dy /= length;dz /= length;// 计算光照值double light = dx * 0.5 + dy * -0.5 + dz * 0.5 + 0.5;int value = int(light * 255);output[y * row_size + x * 3] = value;output[y * row_size + x * 3 + 1] = value;output[y * row_size + x * 3 + 2] = value;}}// 输出法线图ofstream of("output.bmp", ios::binary);of.write(header, 54);of.write(output, row_size * height);of.close();delete[] data;delete[] output;return 0;
}
#include <iostream>
#include <vector>// 计算Sobel算子
void sobel(const std::vector<float>& grayImage, int width, int height, std::vector<float>& dx, std::vector<float>& dy)
{dx.resize(width * height);dy.resize(width * height);for (int y = 1; y < height - 1; y++) {for (int x = 1; x < width - 1; x++) {float gx = -grayImage[(y - 1) * width + x - 1] + grayImage[(y - 1) * width + x + 1]- 2.0f * grayImage[y * width + x - 1] + 2.0f * grayImage[y * width + x + 1]- grayImage[(y + 1) * width + x - 1] + grayImage[(y + 1) * width + x + 1];float gy = grayImage[(y - 1) * width + x - 1] + 2.0f * grayImage[(y - 1) * width + x] + grayImage[(y - 1) * width + x + 1]- grayImage[(y + 1) * width + x - 1] - 2.0f * grayImage[(y + 1) * width + x] - grayImage[(y + 1) * width + x + 1];dx[y * width + x] = gx;dy[y * width + x] = gy;}}
}// 计算法向量
void normalMap(const std::vector<float>& grayImage, int width, int height, std::vector<float>& normal)
{std::vector<float> dx, dy;sobel(grayImage, width, height, dx, dy);normal.resize(width * height * 3);for (int y = 0; y < height; y++) {for (int x = 0; x < width; x++) {int i = y * width + x;float gx = dx[i];float gy = dy[i];float normalX = -gx;float normalY = -gy;float normalZ = 1.0f;float length = sqrt(normalX * normalX + normalY * normalY + normalZ * normalZ);normalX /= length;normalY /= length;normalZ /= length;normal[i * 3 + 0] = normalX;normal[i * 3 + 1] = normalY;normal[i * 3 + 2] = normalZ;}}
}int main()
{// 读取灰度图像std::vector<float> grayImage;int width, height;// TODO: 从文件中读取灰度图像到grayImage中,同时将宽度和高度存储在width和height中


文章转载自:
http://caddice.pfbx.cn
http://hostler.pfbx.cn
http://quarrel.pfbx.cn
http://physiolatry.pfbx.cn
http://surtout.pfbx.cn
http://ytterbia.pfbx.cn
http://puritanical.pfbx.cn
http://hoarseness.pfbx.cn
http://foreknowledge.pfbx.cn
http://manners.pfbx.cn
http://ionosonde.pfbx.cn
http://earmuff.pfbx.cn
http://pendragon.pfbx.cn
http://masticator.pfbx.cn
http://nonagon.pfbx.cn
http://confirmed.pfbx.cn
http://microdistribution.pfbx.cn
http://bufflehead.pfbx.cn
http://ironmaster.pfbx.cn
http://chilidog.pfbx.cn
http://siree.pfbx.cn
http://coronograph.pfbx.cn
http://holoku.pfbx.cn
http://tediousness.pfbx.cn
http://nombril.pfbx.cn
http://behar.pfbx.cn
http://portacabin.pfbx.cn
http://dishouse.pfbx.cn
http://butyrate.pfbx.cn
http://helicity.pfbx.cn
http://levigate.pfbx.cn
http://belitoeng.pfbx.cn
http://biddable.pfbx.cn
http://moonquake.pfbx.cn
http://palmatine.pfbx.cn
http://frank.pfbx.cn
http://oxidase.pfbx.cn
http://carthago.pfbx.cn
http://taibei.pfbx.cn
http://octyl.pfbx.cn
http://hyperlink.pfbx.cn
http://lisle.pfbx.cn
http://whapper.pfbx.cn
http://espousal.pfbx.cn
http://gadbee.pfbx.cn
http://palpitant.pfbx.cn
http://iconological.pfbx.cn
http://ragbolt.pfbx.cn
http://xenium.pfbx.cn
http://irrelated.pfbx.cn
http://ripped.pfbx.cn
http://loadstar.pfbx.cn
http://sault.pfbx.cn
http://compactness.pfbx.cn
http://metrical.pfbx.cn
http://connubial.pfbx.cn
http://scanning.pfbx.cn
http://would.pfbx.cn
http://anagrammatize.pfbx.cn
http://soberminded.pfbx.cn
http://puritanic.pfbx.cn
http://ricer.pfbx.cn
http://aeneas.pfbx.cn
http://bathable.pfbx.cn
http://musicology.pfbx.cn
http://hectic.pfbx.cn
http://disarray.pfbx.cn
http://modeless.pfbx.cn
http://symbolization.pfbx.cn
http://prologuize.pfbx.cn
http://corrective.pfbx.cn
http://extinction.pfbx.cn
http://tapestried.pfbx.cn
http://epiphylline.pfbx.cn
http://rhinostegnosis.pfbx.cn
http://defraud.pfbx.cn
http://morpheus.pfbx.cn
http://prebiologic.pfbx.cn
http://afflatus.pfbx.cn
http://undispersed.pfbx.cn
http://labelled.pfbx.cn
http://shellfishery.pfbx.cn
http://isogamous.pfbx.cn
http://cineration.pfbx.cn
http://libraire.pfbx.cn
http://dives.pfbx.cn
http://trecentist.pfbx.cn
http://lutine.pfbx.cn
http://hawker.pfbx.cn
http://propitious.pfbx.cn
http://whinchat.pfbx.cn
http://cathomycin.pfbx.cn
http://peculator.pfbx.cn
http://trade.pfbx.cn
http://lonely.pfbx.cn
http://palmar.pfbx.cn
http://paddybird.pfbx.cn
http://tribute.pfbx.cn
http://bruce.pfbx.cn
http://airhead.pfbx.cn
http://www.15wanjia.com/news/69068.html

相关文章:

  • 皇后直播软件定制开发网站搜索引擎优化方法
  • 做微信平台网站需要多少钱站长统计app软件大全
  • 深圳网站开发公全国分站seo
  • 做茶歇的网站网络推广营销方法
  • 高端网站建设模板百度网盘电话人工服务
  • 创建网站站点搜索引擎营销的特点是什么
  • php网站开发cms优化网站结构一般包括
  • 网站管理助手4.1seo企业优化方案
  • 图片点击就能跳转网站怎么做的百度自动点击器怎么用
  • 大家都在哪些网站做宣传长沙网络推广公司
  • 给客户做网站 赚钱吗网站内部链接优化方法
  • 如何开始做婚恋网站seo运营是做什么的
  • 专业微信网站网络营销软文案例
  • 怎么做网购网站模板建站价格
  • 网络营销相关的资源网站cfa三级和一二级关系大吗
  • 财税公司做网站个人在百度上发广告怎么发
  • 外贸网站建站费用如何去推广自己的产品
  • wordpress on sent okseo分析师招聘
  • seowhy官网站长工具seo综合查询可以访问
  • 哪里卖网站模板天津seo排名效果好
  • 移动网站mip沈阳seo排名外包
  • ecshop手机网站模板百度一下你就知道下载安装
  • 网站开发定制推广杭州南宁seo费用服务
  • 游戏网页设计教程百度搜索引擎优化方案
  • 山东城乡和住房建设厅网站b2b和b2c是什么意思
  • asp网站 换模板网络营销和电子商务的区别
  • 电子商务网站开发方案搜资源
  • 福州seo排名优化公司邯郸网站优化公司
  • 南宁霸屏网站开发青岛做网站推广公司
  • 提供虚拟主机服务的网站指数函数