OpenGL 超级宝典笔记 —— 纹理高级(三)

2023-11-16

纹理组合器

OpenGL 的纹理组合器可以控制多重纹理的片段是如何组合的。一般情况下,我们可以简单的为每个纹理单元设置一个纹理环境模式 (GL_REPLACE,GL_DECAL,GL_ADD 和 GL_MODULATE),把每个纹理应用的结果添加到下一个纹理单元中。然而纹理组合器提供了一个新的纹理环境 GL_COMBINE 允许我们显示地控制每一个纹理单元的纹理片段是如何组合的。使用纹理组合器模式代码如下:

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);

纹理组合器是通过 glTexEnv 函数来控制的。然后我们需要设置使用哪个纹理组合器的函数。glTexEnv 函数的第二个参数是组合器函数的选择器,可以是 GL_COMBINE_RGB 或 GL_COMBINE_ALPHA。第三个参数是你想使用的纹理环境函数。这个参数值如下表:

常量 函数
GL_REPLACE Arg0
GL_MODULATE Arg0 * Arg1
GL_ADD Arg0 + Arg1
GL_ADD_SIGNED Arg0 + Arg1 – 0.5
GL_INTERPOLATE (Arg0 * Arg2) + (Arg1 * (1-Arg2))
GL_SUBTRACT Arg0 - Arg1
GL_DDT3_RGB/GL_DDT3_RGBA 4*((Arg0r-0.5)*(Arg1r-0.5)+(Arg0g-0.5)*(Arg1g-0.5)+(Arg0b-0.5)*(Arg1b-0.5))

例如你给 RGB 值选择 GL_REPLACE 组合器,你的函数调用如下:

glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE);

上表中的 Arg0——Arg2 通过更多的 glTexEnv 调用来设置。GL_SOURCEx_RGB 和 GL_SOURCEx_ALPHA 值用于指定 RGB 和 alpha 组合器函数的参数,x 可以是 0,1 或者 2,这些来源的值如下表:

常量 描述
GL_TEXTURE 来源于当前绑定的纹理单元
GL_TEXTUREx 来源于绑定的纹理 x
GL_CONSTANT 颜色值或 aplha 值来源于通过 GL_TEXTURE_ENV_COLOR 参数设置的值
GL_PRIMARY_COLOR 来源于原几何图形片段
GL_PREVIOUS 来源于前一个纹理单元的纹理环境的结果

例:你设置 Arg0 为纹理单元 0

glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE0);

我们还可以对给定的源值施加额外的控制。设置这些操作数,我们可以使用常量 GL_OPERANDx_RGB 或者 GL_OPERANDx_ALPHA,x 可以是 0,1 或者 2,可以给这些操作数赋予的值如下表:

常量 描述
GL_SRC_COLOR 源颜色值,不能用于 GL_OPERANDx_ALPHA
GL_ONE_MINUS_SRC_COLOR 源颜色值的反码 (1-value) 不能用于 GL_OPERANDx_ALPHA
GL_SRC_ALPHA 源 alpha 值
GL_ONE_MINUS_SRC_ALPHA 源 alpha 值的反码 (1-value)

例如你已经在两个纹理单元中加载了两个纹理,你在应用纹理时,想要把两个纹理的颜色值相乘,你可以如下设置:

// 设置纹理环境为纹理组合

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);

// 告诉 OpenGL,对 RGB 值使用组合函数 GL_MODULATE

glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);

// 设置 arg0 为第 0 个纹理单元

glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE0);

glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);

// 设置 arg1 为纹理单元 1

glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_TEXTURE1);

glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR):

我们还可以为纹理组合器,指定一个 RGB 或 alpha 的缩放因子。默认情况下是:

glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE, 1.0f);

glTexEnvf(GL_TEXTURE_ENV, GL_ALPHA_SCALE, 1.0f);

点精灵

点精灵的特性是 OpenGl1.5 开始引入的。使用点精灵,我们可以通过绘制一个 3D 的点来把纹理图像映射的屏幕上。例如原本是一个矩形的几何图元(由四个顶点组成),然后再把 2D 的纹理映射到这个矩形上才能得到的效果,现在使用点精灵则只需要绘制一个 3D 的点就可以了。这减少了处理器需要处理的顶点,也减少了顶点传输的带宽,提高了性能。

例如,大量的微粒在屏幕上移动形成魔幻般的视觉效果,可以通过点精灵来实现(常见的屏幕保护程序)。

在点精灵之前,要实现这种效果,我们需要在屏幕上绘制大量的纹理多边形,并需要通过对多边形进行旋转,以确保它面对这照相机。而点精灵纹理允许我们绘制一个 3D 的顶点,来渲染一个完美对齐的纹理 2D 多边形。

使用点精灵

点精灵非常容易使用,开启点精灵 GL_POINT_SPRITE,设置纹理环境的目标位 GL_POINT_SPRITE 的 GL_COORD_REPLACE 参数为真,发送 3D 点。

glBindTexture(GL_TEXTURE_2D, objectID);

glEnable(GL_POINT_SPRITE);

glTexEnvi(GL_POINT_SPRITE, GL_COORD_REPLACE, GL_TRUE);

glBegin(GL_POINTS);

glEnd();

把之前第六章的 smooth 样例进行修改,使用点精灵的方式来绘制,代码如下:

#include "gltools.h" #include <math.h>
#include "math3d.h" //屏幕的宽,高 #define SCREEN_X 800 #define SCREEN_Y 600 //大中小星星的数量 #define LARGE_NUM 20 #define MEDIUM_NUM 30 #define SMALL_NUM 40 //星星的坐标 M3DVector2f smallStars[SMALL_NUM];
M3DVector2f mediumStars[MEDIUM_NUM];
M3DVector2f largeStars[LARGE_NUM]; #define TEXNUM 2 #define STAR 0 #define MOON 1
GLuint textureObj[TEXNUM]; void ProcessMenu(int value); void ChangeSize(GLsizei w, GLsizei h)
{ if (h == 0)
    h = 1;

  glViewport(0, 0, w, h);

  glMatrixMode(GL_PROJECTION);
  glLoadIdentity(); //设置为2D的正投影,使得坐标从屏幕的左下角开始 gluOrtho2D(0.0, SCREEN_X, 0.0, SCREEN_Y);

  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();

  glutPostRedisplay();
} void SetupRC()
{
  glClearColor(0.0f, 0.0f, 0.0f, 1.0f); //随机获取星星的位置  for (int i = 0; i < SMALL_NUM; ++i)
  {
    smallStars[i][0] = (GLfloat)(rand() % SCREEN_X);
    smallStars[i][1] = (GLfloat)(rand() % SCREEN_Y);
  } for (int i = 0; i < MEDIUM_NUM; ++i)
  {
    mediumStars[i][0] = (GLfloat)(rand() % SCREEN_X);
    mediumStars[i][1] = (GLfloat)((rand() % SCREEN_Y) + 50);
  } for (int i = 0; i < LARGE_NUM; ++i)
  {
    largeStars[i][0] = (GLfloat)(rand() % SCREEN_X);
    largeStars[i][1] = (GLfloat)(rand() % SCREEN_Y);
  }

  GLint iWidth, iHeight, iComponents;
  GLenum eFormat; //生成纹理对象 glGenTextures(TEXNUM, textureObj); //加载纹理图片 glBindTexture(GL_TEXTURE_2D, textureObj[STAR]);
  glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE); void *pImage = gltLoadTGA("..\\images\\star.tga", &iWidth, &iHeight, &iComponents, &eFormat); if (pImage)
  {
    glTexImage2D(GL_TEXTURE_2D, 0, iComponents, iWidth, iHeight, 0, eFormat, GL_UNSIGNED_BYTE, pImage);
    free(pImage);
    pImage = NULL;
  }
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

  glBindTexture(GL_TEXTURE_2D, textureObj[MOON]);

  glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
  pImage = gltLoadTGA("..\\images\\moon.tga", &iWidth, &iHeight, &iComponents, &eFormat); if (pImage)
  {
    glTexImage2D(GL_TEXTURE_2D, 0, iComponents, iWidth, iHeight, 0, eFormat, GL_UNSIGNED_BYTE, pImage);
    free(pImage);
    pImage = NULL;
  }
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); //启用点精灵 glTexEnvi(GL_POINT_SPRITE, GL_COORD_REPLACE, GL_TRUE);
  glEnable(GL_POINT_SPRITE);

  ProcessMenu(3);

} void RenderScene()
{
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

  glColor3f(1.0f, 1.0f, 1.0f); //绑定纹理,使用点精灵 glBindTexture(GL_TEXTURE_2D, textureObj[STAR]);
  glEnable(GL_POINT_SPRITE); 
  glEnable(GL_TEXTURE_2D);
  glEnable(GL_BLEND); //画小星星 glPointSize(7.0);
  glBegin(GL_POINTS); for (int i = 0; i < SMALL_NUM; ++i)
    glVertex2fv(smallStars[i]);
  glEnd(); //画中等大小的星星 glPointSize(12.0);
  glBegin(GL_POINTS); for (int i = 0; i < MEDIUM_NUM; ++i)
  {
    glVertex2fv(mediumStars[i]);
  }
  glEnd(); //大星星 glPointSize(20.0);
  glBegin(GL_POINTS); for (int i = 0; i < LARGE_NUM; ++i)
  {
    glVertex2fv(largeStars[i]);
  }
  glEnd();

  glBindTexture(GL_TEXTURE_2D, textureObj[MOON]); //画月亮 glPointSize(120.0f);

  GLfloat x = 650.0f;
  GLfloat y = 400.0f;
  glBegin(GL_POINTS);
    glVertex2f(x, y);
  glEnd(); //星座连线 glDisable(GL_TEXTURE_2D);
  glDisable(GL_POINT_SPRITE);
  glLineWidth(3.0);
  glBegin(GL_LINE_STRIP);
  glVertex2f(0.0f, 50.0f);
  glVertex2f(50.0f, 150.0f);
  glVertex2f(100.0f, 20.0f);
  glVertex2f(300.0f, 300.0f);
  glVertex2f(450.0f, 100.0f);
  glVertex2f(600.0f, 200.0f);
  glVertex2f(800.0f, 30.0f);
  glEnd();
  glutSwapBuffers();
} void ProcessMenu(int value)
{ switch (value)
  { case 1:
    { //开启混合 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
      glEnable(GL_BLEND);
      glEnable(GL_POINT_SMOOTH);
      glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);
      glEnable(GL_LINE_SMOOTH);
      glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
      glEnable(GL_POLYGON_SMOOTH);
      glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST);
      glDisable(GL_TEXTURE_2D);
      glDisable(GL_POINT_SPRITE); break;
    } case 2:
    { //关闭混合 glDisable(GL_BLEND);
      glDisable(GL_POINT_SMOOTH);
      glDisable(GL_LINE_SMOOTH);
      glDisable(GL_POLYGON_SMOOTH);
      glDisable(GL_TEXTURE_2D);
      glDisable(GL_POINT_SPRITE); break;
    } case 3: //点精灵  glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR);
    glDisable(GL_LINE_SMOOTH);
    glDisable(GL_POINT_SMOOTH);
    glDisable(GL_POLYGON_SMOOTH); break; default: break;
  }

  glutPostRedisplay();
} void ShutdownRC()
{
  glDeleteTextures(TEXNUM, textureObj);
} int main(int args, char **argv)
{
  glutInit(&args, argv);
  glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
  glutInitWindowSize(SCREEN_X, SCREEN_Y);
  glutCreateWindow("POINTSPRITES"); //右键菜单 int menuID = glutCreateMenu(ProcessMenu);
  glutAddMenuEntry("antialiasing", 1);
  glutAddMenuEntry("normal", 2);
  glutAddMenuEntry("pointsprites", 3);
  glutAttachMenu(GLUT_RIGHT_BUTTON);

  glutDisplayFunc(RenderScene);
  glutReshapeFunc(ChangeSize);
  SetupRC();
  glutMainLoop(); return 0;
}

效果如下:

纹理应用

点精灵遵循所有的 2D 纹理的规则,包括纹理环境为 GL_DECAL,GL_REPLACE,GL_MODULATE 等,以及 mipmapped 和多重纹理。如果把 GL_COORD_REPLACE 设置为加,

glTexEnvi(GL_POINT_SPRITE, GL_COORD_REPLACE, GL_FALSE);

那么顶点指定单个纹理坐标,并应用于整个点。如果为 GL_TRUE,则 OpenGL 根据点的表面对纹理坐标进行插值。当然这些点的大小必须是大于 1.0 的。

点精灵参数

点精灵的特性可以通过 glPointParameter 来进行微调,下图展示应用点精灵的两个不同纹理坐标的原点位置。

通过设置 GL_POINT_SPRITE_COORD_ORIGIN 为 GL_LOWER_LEFT 把纹理坐标的原点设置到左下角。

glPointParameteri(GL_POINT_SPRITE_COORD_ORIGIN, GL_LOWER_LEFT);

更多的参数设置参考 https://www.opengl.org/sdk/docs/man/xhtml/glPointParameter.xml

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenGL 超级宝典笔记 —— 纹理高级(三) 的相关文章

  • VBO - 没有指数化的指数化

    我正在尝试将 VBO 与元素数组缓冲区一起用于我的三角形 如下所示 glBindBuffer GL ARRAY BUFFER g Buffer 0 glVertexPointer 3 GL FLOAT 0 BUFFER OFFSET 0 g
  • 静态链接库时出现 glew 链接器错误

    我正在尝试在 Visual Studio 2012 中构建一个 opengl 项目 我想静态包含 glew 库 因此我从源代码构建它并将生成的 glew32sd lib 复制到我的 lib 目录 我将此 lib 路径提供给 Visual S
  • OpenGL NURBS 曲面

    我正在学习 OpenGL 我想要一个中间有轻微驼峰的表面 我目前正在使用这段代码 但我不确定如何调整 ctrl 点以使其达到我想要的方式 它目前就像 我想要这样的 我不完全确定我应该使用哪些控制点 并且我对其工作原理感到困惑 include
  • 使用 openGL、SOIL 加载图像

    我尝试了很多使用 SOIL 在 openGL 中加载和显示图像的示例 运行下面的源代码时 它仅显示一个没有图像的白色四边形 我尝试打开一个名为 foto 的图像 我将图像文件放在程序的文件夹中 bool keyStates new bool
  • 哪个对缓存最友好?

    我试图很好地掌握面向数据的设计以及如何在考虑缓存的情况下进行最佳编程 基本上有两种情况我无法完全确定哪个更好以及为什么 是拥有一个对象向量更好 还是拥有对象原子数据的多个向量更好 A 对象向量示例 struct A GLsizei mInd
  • (定义一个宏)方便OpenGL命令调试?

    有时插入条件打印和检查需要很长时间glGetError 使用二分搜索的形式来缩小范围 其中第一个函数调用是 OpenGL 首先报告错误 我认为如果有一种方法可以构建一个宏 我可以包装所有可能失败的 GL 调用 并有条件地调用 那就太酷了gl
  • OpenGL 的每个组件 alpha 通道?

    是否可以使用 OpenGL 对每个组件使用一个 alpha 通道 一个用于红色 一个用于绿色 一个用于蓝色 进行混合 如果没有 有哪些可能的解决方法 这不是直接支持的东西 不过 您自己实现起来相当容易 使用 3 通道 alpha 纹理渲染三
  • 如何用opengl制作2D地形?

    我想制作一个简单的二维地形 只有一些颠簸和高度变化 我想过只使用随机数来描述某个顶点的高度 但我不知道如何从中制作一个网格 我正在寻找一种方法来查找地形的顶点和索引缓冲区 我该怎么做呢 您可以仅将 GL POLYGON 与所有顶点的列表一起
  • 在 OpenGL 中,为什么 glVertexAttribPointer 要求“指针”参数以 void* 形式传入?

    规格为glVertexAttribPointer如下 void glVertexAttribPointer GLuint index GLint size GLenum type GLboolean normalized GLsizei s
  • OpenGL:调试“单通道线框渲染”

    我正在尝试实现论文 单通道线框渲染 它看起来很简单 但它给了我所期望的厚暗值 论文没有给出计算海拔高度的确切代码 所以我按照自己认为合适的方式进行了操作 代码应该将三个顶点投影到视口空间中 获取它们的 高度 并将它们发送到片段着色器 片段着
  • 使用 Qt 在 xoverlay 之上绘制

    我希望在使用 Xoverlay 渲染的视频流之上绘制一些 UI 我正在使用 gstreamer 播放视频并使用 xoverlay 在 xvimagesink 上渲染它 我的小部件继承自 QGLWidget 我希望使用 QPainter 绘制
  • 如何安装适用于 Windows C++ 的最新版本 OpenGL?

    我正在使用 Visual Studio 2010 运行 Windows 7 包含的 OpenGL 版本 include 是版本 1 1 我希望使用合理的当前版本 某种版本 3 或 4 我需要做什么才能达到该状态 OpenGL SDK 页面位
  • OpenGL 着色器不与着色器程序链接

    我正在尝试使用 GLFW GLEW 添加着色器 我收到一个错误 指出着色器已加载 但它们没有有效的对象代码 这是我用于加载着色器的代码 class SHADER public void LoadShaders const char vert
  • 将像素传递给 glTexImage2D() 后会发生什么?

    例如 如果我创建一个像素数组 如下所示 int getPixels int pixels new int 10 pixels 0 1 pixels 1 0 pixels 1 1 etc glTexImage2D getPixels glTe
  • 使用draw()而不是eventloop时的pyglet

    我正在尝试用 pyglet 画一个圆 但当我使用 draw 函数而不是 app run 循环时 它是不可见的 有什么建议我可以做什么吗 谢谢 from math import from pyglet gl import window pyg
  • 使用 C# 截取任何外部应用程序的屏幕截图

    我们有一个 C WPF 应用程序 我们想要在其中截取我们启动的任意应用程序的屏幕截图 即 我们可以引用我们启动的进程 应用程序可能已最小化或位于其他窗口后面 但我们仍然只需要单个应用程序的图像 而不是重叠像素 我知道使用 BitBlt 或的
  • OpenGL - 两个纹理的幂

    OpenGL 使用二次幂纹理 这是因为由于 MipMapping 某些 GPU 只接受 2 的幂纹理 当绘制比实际更大的纹理时 使用这些二次方纹理会导致问题 我想到了一种方法来解决这个问题 即仅在我们使纹理小于实际大小时使用 PO2 比率
  • OpenGL缓冲区更新[重复]

    这个问题在这里已经有答案了 目前我正在编写一个模拟水的程序 以下是我所做的步骤 创建水面 平面 创建VAO 创建顶点缓冲区对象 在其中存储法线和顶点 将指针绑定到此 VBO 创建索引缓冲区对象 然后我使用 glDrawElements 渲染
  • 存储 OpenGL 状态

    假设我正在尝试用 C 制作某种小型 opengl 图形引擎 我读过通过访问 opengl 状态glGet 函数可能非常昂贵 虽然访问 opengl 状态似乎是一个经常操作 并且强烈建议将 opengl 状态的副本存储在具有快速读 写访问权限
  • 使用 GLSL 直接在着色器中从位置计算平移矩阵

    我正在开发 C OpengL 程序以及 GLSL 顶点和片段着色器 我正在创建同一对象的多个实例 我只需要改变实例之间的对象位置 这是我所做的 我正在使用一个统一变量 它是一个变换矩阵数组 每个矩阵代表一个对象实例 MVP 也是一个变换矩阵

随机推荐

  • YOLOV5更换轻量级的backbone:mobilenetV2

    目录 简洁概要 修改主干网络 一 添加自己主干网络 二 在yolo py中添加common中的两个函数 三 制作mobilenetv2的yaml配置文件 四 制作数据集VOC的yaml配置文件 五 启用训练 六 性能检测 简洁概要 Mobi
  • Elasticsearch 8.8.0 发布

    Elasticsearch 是一个基于 Lucene 库的搜索引擎 它提供了一个分布式 支持多租户的全文搜索引擎 具有 HTTP Web 接口和无模式 JSON 文档 Elasticsearch 基于 Java 开发 并在 SSPL Ela
  • 使用mongo命令工具操作集合数据

    与 MongoDB 建立连接 mongo 如果设置了密码 使用这行命令 mongo port 27017 u admin p xxxxxx authenticationDatabase admin 以操作八月创建的历史数据为例 确认操作集合
  • docker 启动时错误docker: Cannot connect to the Docker daemon

    在学习docker的时候遇到一个错误docker Cannot connect to the Docker daemon at unix var run docker sock Is the docker daemon running 如下
  • make[1]: [persist-settings] Error 2 (ignored) CC adlist.o /bin: cc: command not found make[1]: *

    Linux系统安装Redis执行Make编译时报错 make 1 persist settings Error 2 ignored CC adlist o bin cc command not found make 1 adlist o E
  • 微信小程序 scroll-view的滚动条设置

    小程序的scroll view用的比较多了 列表页一般也没管它的滚动条 最近突然发现在android与ios中横向滑动的时候表现不一样 不一样在哪呢 ios上直接就不显示啊 也是没谁了 深入想了一下 这滚动条能不能换一颜色或者换个样式 有这
  • 基于AIOT技术的智慧校园空调集中管控系统设计与实现

    AIOT技术的智慧校园空调集中管控系统设计与实现本科毕业论文 I 引言 本文旨在探讨基于AIOT技术的智慧校园空调集中管控系统的设计和实现 首先 综述当前AIOT技术发展状况和智慧校园空调集中管控系统在当前应用领域中的重要性 其次 分析相关
  • 原理图符号(原理图库)创建流程及注意事项

    参考资料 电巢EMEA体验营二期 1 原理图符号创建流程 1 0 元器件属性 以一款压力传感器芯片LPS22HH为例 来讲解原理图符号的创建流程 LPS22HH的引脚描述如下所示 1 1 创建工程 1 2 创建原理图符号文件 创建完成原理图
  • Xilinx BUFGMUX使用注意事项

    Xilinx BUFGMUX使用注意事项 最近使用Xilinx FPGA的时候 需要用到一个外部时钟和一个PLL产生的时钟 可以通过外部SWICH进行时钟的切换 觉得这种方式可以通过原语例化完成 原语 果不其然 在原语示例中找到了类似的模块
  • java基础:浅谈泛型

    1 为什么要使用泛型 给一段代码 import java util ArrayList import java util List public class GenericList error public static void main
  • 解决“The method XXXXXX of type XXXXXXXXX must override a superclass method”

    我的Eclipse版本是3 6 1 Override 时出现以下错误 The method XXXXXX of type XXXXXXXXX must override a superclass method 上网搜索原来原因是 实现类里面
  • Docker 部署Streamlit项目

    文章目录 前言 关于streamlit Docker 部署Streamlit项目 Streamlit如何部署到云服务器 1 安装docker 2 拉取python镜像 2 1 什么是DockerHub 2 2 配置docker加速器 2 3
  • SpringMVC增删改查(CRUD)的实现

    目录 前言 一 前期准备 1 pom xml 依赖与插件的导入 2 jdbc properties 数据库连接 3 log4j2 xml 日志文件 4 spring mybatis mybatis与spring整合文件 5 spring c
  • 解决AttributeError: module 'tensorflow' has no attribute 'ConfigProto'

    使用CUDA10 1加上Tensorflow 2 0会出现AttributeError module tensorflow has no attribute ConfigProto 这个问题 这个是由于现在新版本中一些1 0版本的函数被和2
  • Android自动化测试中操作技巧合集(建议收藏)

    Android自动化测试中短信验证码的操作技巧 一 内容提供器机制简介 Android 系统采用了内容提供器 ContentProvider 机制来管理不同应用的数据访问 内容提供器为不同应用间的数据共享提供了接口 它们像是一个中央数据仓库
  • 快速中值求取算法

    中值 顾名思义 就是指一个从小到大的序列的中间的那一个数 一般的讲 中值比平均值还要更加稳定 如一个序列中的某一个值被误乘以了100 平均值则会有很大的波动 但是中位数则不会发生太大的变化 但是如果对数据先排序 然后再进行取中值 则比较耗时
  • Spring3与安全框架apache shiro的整合

    shiro是一个很不错的安全框架 相对Spring security 来说要简单易用的多 使用shiro来做web的权限子系统是不错的选择 下面记录一下shiro和Spring整合的过程 Applicationcontext shiro x
  • k-近邻算法

    k 近邻算法 k 近邻算法概述 k 近邻算法 k NearestNeighor Algorithm 是采用测量不同特征值之间的距离方法进行分类 简称kNN 这里用到的距离计算是欧几里德距离 工作原理 存在一个样本数据集合 i 0 n 也称作
  • 《Ansible Playbook扩展:block块》

    一 用块分组任务 block任务块就是一组逻辑的tasks 使用block可以将多个任务合并为一个组 示例如下 block name 检查 service 服务 role 节点端口 shell nc vz MYSQL MASTER HOST
  • OpenGL 超级宝典笔记 —— 纹理高级(三)

    纹理组合器 OpenGL 的纹理组合器可以控制多重纹理的片段是如何组合的 一般情况下 我们可以简单的为每个纹理单元设置一个纹理环境模式 GL REPLACE GL DECAL GL ADD 和 GL MODULATE 把每个纹理应用的结果添