我使用freeglut,GLEW 和魔鬼,以呈现纹理的茶壶使用顶点和片段着色器.这在Ubuntu 14.04上的OpenGL 2.0和GLSL 1.2中都运行良好.
现在,我想将凹凸贴图应用于茶壶.我的讲师显然不会酿造他自己的茶,所以不知道他们应该是顺利的.无论如何,我找到了一个关于老式凹凸贴图的漂亮教程,其中包括一个片段着色器,它开始于:
uniform sampler2D DecalTex; //The texture
uniform sampler2D BumpTex; //The bump-map
Run Code Online (Sandbox Code Playgroud)
他们没有提到的是如何将两个纹理首先传递给着色器.
以前我
//OpenGL cpp file
glBindTexture(GL_TEXTURE_2D, textureHandle);
//Vertex shader
gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
//Fragment shader
gl_FragColor = color * texture2D(DecalTex,gl_TexCoord[0].xy);
Run Code Online (Sandbox Code Playgroud)
所以现在我
//OpenGL cpp file
glBindTexture(GL_TEXTURE_2D, textureHandle);
glBindTexture(GL_TEXTURE_2D, bumpHandle);
//Vertex shader
gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
gl_TexCoord[1] = gl_TextureMatrix[1] * gl_MultiTexCoord1;
//Fragment shader
gl_FragColor = color * texture2D(BumpTex,gl_TexCoord[0].xy);
//no bump logic yet, just testing I …Run Code Online (Sandbox Code Playgroud) 我在Unity中有一组Sprite对象.它们的大小取决于加载的图像.我想将它们像平铺地图并排组合成一个图像.我希望它们的布局就像你正在形成一排图像,一个接一个.(注意:没有一个在另一个之上)我怎么能这样做?
我正在组合的原因(仅适用于那些想知道的人)是因为我正在使用polygon2D Collider.由于当我并排使用多个碰撞器时发生了一些奇怪的行为,我决定在添加一个大的多边形碰撞器之前组合图像.请注意,这些事情发生在运行时.我不能只创建一个大图像并加载,因为图像的顺序只在运行时确定.
我希望能得到一些帮助.谢谢.
这是一个奇怪的问题,但我想知道为什么glTexImage2d关心像素数据类型和Null数据的格式.glTexImage2d的签名是......
void glTexImage2D( GLenum target, GLint level, GLint internalFormat,
GLsizei width, GLsizei height, GLint border, GLenum format,
GLenum type, const GLvoid * data);
Run Code Online (Sandbox Code Playgroud)
internalFormat用于告诉图形驱动程序您要在gpu上存储数据,格式和类型告诉图形驱动程序对GLvoid*数据的期望.所以,如果我没有传递任何数据,例如通过传递null,为什么图形驱动程序会关心格式和类型是什么?所以这是一个奇怪的问题,因为有时它不会.它的时间,我没有检查每一次迭代但是,特别是在制作深度纹理时,或者我最近遇到的是整数类型,如GL_RED_INTEGER,GL_RG_INTEGER等和/或它们对应的内部格式如GL_R8I,GL_RGBA32UI.然而,任何"简单"类型都不必与internalFormat相对应,如GL_RGBA8,GL_RGBA32F等.出于某种原因,即使您没有通过,以前的特定数据类型和格式也必须精确任何数据.这是为什么?
早上好(如果早上你在哪里)
我一直在环顾四周,并没有看到一个令人满意的方法这样做,以为我会问周围...
理想的世界我希望能够生成透明的Texture2D对象.将其绘制到屏幕上我希望能够"绘制"它,即当鼠标左键按下时,光标所在的任何像素都应该设置为黑色.接下来,我需要能够使用这个纹理.
使用纹理是很容易的部分,我们可以简单地为"绘画"对象创建一个新的Texture2D属性,并在SpriteBatch.Draw方法中使用它.两个棘手的部分是
如果有人有这些经验,你会非常感激.
在使用纹理内存时,我遇到了以下代码: -
uint f = (blockIdx.x * blockDim.x) + threadIdx.x;
uint c = (blockIdx.y * blockDim.y) + threadIdx.y;
uint read = tex2D( refTex, c+0.5f, f+0.5f);
Run Code Online (Sandbox Code Playgroud)
我的问题是,为什么我们添加0.5f到两个c及f?这让我感到困惑..谢谢你
glBindImageTexture和glBindTexture有什么区别?并且着色器中的以下声明之间的区别是什么:
layout (binding = 0, rgba32f) uniform image2D img_input;
Run Code Online (Sandbox Code Playgroud)
和
uniform sampler2D img_input;
Run Code Online (Sandbox Code Playgroud) 我已经环顾了很多,我发现从Bitmap创建Texture2D的唯一方法是:
using (MemoryStream s = new MemoryStream())
{
bmp.Save(s, System.Drawing.Imaging.ImageFormat.Png);
s.Seek(0, SeekOrigin.Begin);
Texture2D tx = Texture2D.FromFile(device, s);
}
Run Code Online (Sandbox Code Playgroud)
和
Texture2D tx = new Texture2D(device, bmp.Width, bmp.Height,
0, TextureUsage.None, SurfaceFormat.Color);
tx.SetData<byte>(rgbValues, 0, rgbValues.Length, SetDataOptions.NoOverwrite);
Run Code Online (Sandbox Code Playgroud)
其中rgbValues是一个字节数组,包含32位ARGB格式的位图像素数据.
我的问题是,我可以尝试更快的方法吗?
我正在编写一个地图编辑器,它必须读取自定义格式图像(地图图块)并将它们转换为Texture2D纹理才能显示.以前版本的编辑器是一个C++实现,它首先将图像转换为位图,然后转换为使用DirectX绘制的纹理.我在这里尝试了相同的方法,但是上述两种方法都非常慢.要加载到内存中,映射所需的所有纹理都需要第一个方法~250秒,而第二个方法在合理的规格计算机上需要110秒(为了比较,C++代码需要大约5秒钟).如果有一种方法可以直接编辑纹理数据(例如使用Bitmap类'
任何帮助将非常感谢.
谢谢
XNA noob在这里,每天都在学习.我刚刚研究了如何使用RenderTarget2D将多个纹理合成为一个.然而,虽然我可以将RenderTarget2D用作Texture2D用于大多数目的,但是有一个关键的区别:当后缓冲区调整大小时这些渲染的纹理会丢失(毫无疑问,在其他情况下,例如内存不足的图形设备).
目前,我只是将完成的RenderTarget2D复制到一个新的非易失性Texture2D对象中.不过,我这样做的代码非常难看.有没有更优雅的方式来做到这一点?也许我只是累了,但我无法在Google或SO上找到答案.
略有简化:
public static Texture2D MergeTextures(int width, int height, IEnumerable<Tuple<Texture2D, Color>> textures)
{
RenderTarget2D buffer = new RenderTarget2D(_device, width, height);
_device.SetRenderTarget(buffer);
_device.Clear(Color.Transparent);
SpriteBatch spriteBatch = new SpriteBatch(_device);
spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.NonPremultiplied);
// Paint each texture over the one before, in the appropriate color
Rectangle rectangle = new Rectangle(0, 0, width, height);
foreach (Tuple<Texture2D, Color> texture in textures)
spriteBatch.Draw(texture.Item1, rectangle, texture.Item2);
spriteBatch.End();
_device.SetRenderTarget((RenderTarget2D)null);
// Write the merged texture to a Texture2D, so we don't lose it when resizing the back buffer …Run Code Online (Sandbox Code Playgroud) 我正在为Android构建一个Unity应用程序,它可以动态加载大量的大纹理(所有图像的大小都超过6MB).这些纹理可以来自Amazon S3服务器,在这种情况下它们以流的形式出现,或者来自用户的设备本身.
在这两种情况下,我都可以异步地保持原始数据或纹理而不会出现问题.在第一个我查询服务器并获得带有数据流的回调,在第二个我使用WWW类来获取使用"file://"协议的纹理.
一旦我想将这些数据复制到Texture2D到我可以使用的某个地方,例如在Texture2D私有成员上,问题就会发生.
使用流我将其转换为byte []并尝试调用LoadImage(),而使用WWW类我只需尝试使用myTexture = www.texture进行复制.在纹理加载或复制时,我都会得到一个巨大的帧.我想彻底根除这个框架,因为App简直无法发布.
using (var stream = responseStream)
{
byte[] myBinary = ToByteArray(stream);
m_myTexture.LoadImage(myBinary); // Commenting this line removes frame out
}
...
WWW www = new WWW("file://" + filePath);
yield return www;
m_myTexture = www.texture; // Commenting this line removes frame out
Run Code Online (Sandbox Code Playgroud)
不幸的是,Unity似乎不喜欢在主线程的单独线程上运行这些操作,并在我尝试时抛出异常.
有没有什么方法可以将这些操作分块,以便需要多个帧?或者做一些不会拖延主线程的快速memcopy操作?
提前致谢!
PS:我在以下回购中创建了一个问题的工作示例:https://github.com/NeoSouldier/Texture2DTest/
我有一些AssetBundles,我想转换为.png图像文件.
它们是Texture2D资产,但问题是它们不是Read Enable,当我尝试将它们转换为带有的PNG时
var _bytes = _texture2d.EncodeToPNG();
Run Code Online (Sandbox Code Playgroud)
命令,我收到以下错误信息:
纹理'纹理名称'不可读,无法从脚本访问纹理内存.您可以在纹理导入设置中使纹理可读.
我真的无法访问纹理导入设置,因为它们来自资产包,一切都是用代码制作的.
有人有解决方法吗?
谢谢