- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
更新:我现在可以绘制多个纹理,我弄清楚了 glGenTextures 等是如何工作的,并重写了我的 loadtextures () 函数和东西。然而,只绘制了汽车的几个部分;方向盘、一个轮毂盖和背光灯(也许还有一些小东西)。在 collada 文件中,一些 Material 永远不会与纹理文件相关联。我不认为这是问题所在,因为在我第一次使用时,我将列表中的纹理与前几个多边形列表(5 个,总共大约 80 个)相关联,并且我得到了一辆看起来像在使用正确的纹理,只是缺少轮胎,也许还有一些我没有注意到的小东西。我想这可能与平铺的纹理有关?不管怎样,我想用红色替换所有没有纹理文件的网格,但我不知道该怎么做。我在本教程中开始使用代码:
http://www.opengl-tutorial.org/beginners-tutorials/tutorial-4-a-colored-cube/
我做了一个颜色缓冲区,绑定(bind)它等等,但后来我意识到我需要编辑着色器文件,但我不确定该怎么做。
一:
attribute vec3 vPosition;
attribute vec2 vTextureCoord;
varying vec2 vTexCoord;
uniform mat4 modelview_matrix;
void main(void)
{
vTexCoord = vTextureCoord;
gl_Position = modelview_matrix*vec4(vPosition,1.0);
}
其他:
varying vec2 vTexCoord;
uniform sampler2D myTexture;
void main (void)
{
gl_FragColor = texture2D(myTexture, vTexCoord);
}
/////原始问题
我正在做一个单一的作业,我将不得不绘制一些带有纹理的对象(我必须能够在场景中移动和其他东西,但当我到达它时我会穿过那座桥)。我有一个教程作为基础,它将从一个顶点数组和一个纹理文件中绘制一个对象,来自一个 .obj 文件(我为上一个教程编写了解析器)。
作业使用collada文件,所以我写了一个collada解析器。这真的很辛苦!我的 collada 解析器生成一个包含 Material 对象的 map ,它有很多名称和 id 变量(在 main.cpp 中没有使用,它们只是用于在 collada 文件的各个部分之间关联东西),一个保存纹理文件的 m_TgaFile 变量name 作为字符串,一个 m_Mesh 变量保存 Vertex 对象的 vector ,该对象只有两个 float 组 m_Positions 和 m_Textures 来保存位置和 tex 坐标。
所以到目前为止我能做的是通过在 map 上循环并仅使用 map 中的第一个纹理文件来绘制所有位(它会在几分钟后崩溃,但我稍后会弄清楚,我我很高兴屏幕上出现了一些东西)。我尝试调用 loadTextures ()(并发送一个 Material ),我在 map 上循环,这样我就可以使用每个 Material 的纹理文件,但根本没有绘制任何东西(白屏)。那么我该如何为每一位绘图加载每个纹理呢?
我已经尝试研究它,并想出了我需要使用 glBindTexture、glTexImage2D 和另一个我不记得的事实。前两个在我的教程附带的 TgaParser 中。 glBindTexture 在绘图代码中再次使用,第二个参数为零。据我所知,这意味着使用加载的默认纹理。我不知道如何在需要时加载每个纹理,我不明白纹理名称的含义以及它如何与纹理数据相关联。
哦,我试过在 OpenGl 主函数中进行循环,并将 pMaterial 作为变量发送到显示函数,但它不喜欢那样,我认为它不会起作用,但我认为我至少可以试试。
这是一些代码。
OpenGL 主要功能:
int main(int argc, char **argv)
{
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(screenWidth, screenHeight);
glutCreateWindow("Intro to shading");
glewInit();
init();
glutDisplayFunc(forward_display);
glutIdleFunc(forward_animate);
glutMainLoop();
/*
DONT DO THINGS HERE
*/
return 0;
}
绘图函数:
void forward_display()
{
glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
//glScalef(0.5,0.5,0.5);
glScalef(0.005,0.005,0.005);
glRotatef(timeGetTime()*0.01,0,1,0);
GLfloat m[16];
glGetFloatv (GL_MODELVIEW_MATRIX, m);
glUniformMatrix4fv(gvModelMatrixHandle,1,false,m);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,0);
colladaObject->m_MaterialMap.StartIterator ();
while(!colladaObject->m_MaterialMap.IsEOM ())
{
shared_ptr<Material> pMaterial = colladaObject->m_MaterialMap.Get ();
if(pMaterial->m_Mesh.size () != 0)
{
glVertexAttribPointer(gvPositionHandle, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), &pMaterial->m_Mesh[0].m_Positions);//v[0].pos
glEnableVertexAttribArray(gvPositionHandle);
glVertexAttribPointer(gvTextureCoordhandle, 2, GL_FLOAT, GL_FALSE,sizeof(Vertex), &pMaterial->m_Mesh[0].m_Textures);//&v[0].texCoords
glEnableVertexAttribArray(gvTextureCoordhandle);
glDrawArrays(GL_TRIANGLES, 0, pMaterial->m_Mesh.size());
}
colladaObject->m_MaterialMap.MoveNext ();
}
glutSwapBuffers();
}
初始化函数:
void init()
{
char * vertexShaderBuffer = readFileData("../resources/shaders/IntroToShaders.vs");
char * pixelShaderBuffer = readFileData("../resources/shaders/IntroToShaders.ps");
gProgram = createProgram(vertexShaderBuffer, pixelShaderBuffer);
//We have finished compiling the shader now delete the char arrays with the source code
delete [] vertexShaderBuffer;
delete [] pixelShaderBuffer;
gvPositionHandle = glGetAttribLocation(gProgram, "vPosition");
gvTextureCoordhandle = glGetAttribLocation(gProgram, "vTextureCoord");
gvModelMatrixHandle = glGetUniformLocation(gProgram, "modelview_matrix");
if (gvPositionHandle==-1)
printf("gvPositionHandle is bad\n");
if (gvTextureCoordhandle==-1)
printf("gvTextureCoordhandle is bad\n");
if (gvModelMatrixHandle==-1)
printf("gvModelMatrixHandle is bad\n");
glUseProgram(gProgram);
//cube = new ObjParser("../resources/mesh/cube.obj");
colladaObject = new ColladaParser("../resources/mesh/car.dae");
loadTextures();
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glEnable (GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}
loadTextures 函数:
void loadTextures ()
{
//just try loading the first texture to make sure all the other code changes work before playing with this one.
colladaObject->m_MaterialMap.StartIterator ();
shared_ptr<Material> pMaterial = colladaObject->m_MaterialMap.Get ();
while(pMaterial->m_TgaFile == "")
{
colladaObject->m_MaterialMap.MoveNext ();
pMaterial = colladaObject->m_MaterialMap.Get ();
}
char tgafile [100];
strcpy(tgafile, "../resources/textures/");
strcat(tgafile, pMaterial->m_TgaFile.c_str ());
TgaParser explosion(tgafile);
}
TgaParser 构造函数的 END(还有很多实际打开文件和读取位等的地方)
unsigned char * imageData = (unsigned char*)getData (fp, size, imageBits);
myId=id;
glBindTexture (GL_TEXTURE_2D, id);
glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
/* glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); */
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
/* glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); */
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexImage2D (GL_TEXTURE_2D, 0, texFormat, imageWidth, imageHeight, 0, texFormat, GL_UNSIGNED_BYTE, imageData);
/* release data, its been uploaded */
free (imageData);
fclose(fp);
id++;
最佳答案
没有好的方法可以在渲染过程中切换纹理。您需要做的是按纹理( Material )分离网格,分别绘制它们并在使用 glBindTexture(GL_TEXTURE_2D, id)
的绘制调用之间切换纹理(以及可能的 Material 统一值)。
关于c++ - 在 OpenGL 中使用多个纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16127522/
我有一个未定义数量的显示上下文,每个都将显示一个纹理。当我调用 glGenTextures 时,我会在所有显示上下文中返回相同的名称。这会起作用吗?即使它们具有相同的名称,它们仍会存储和显示不同的纹理
我在 SVG 中看到过:文本填充是图像而不是颜色;我一直想知道使用 CSS3 是否可以实现这样的事情。 我浏览了整个网络,到目前为止只找到了基本上将图像覆盖在文本上的解决方法(请参阅 this ,这对
我是 WebGL 的新手。 :)我知道顶点数据和纹理不应该经常更新,但是当它们确实发生变化时,首选哪个:- 通过调用 gl.deleteBuffer 销毁先前的缓冲区 (static_draw) 并创
我需要将 GL_RGBA32F 作为内部格式,但我在 OpenGL ES 实现中没有得到它。相反,我只得到 GL_FLOAT 作为纹理数据类型。 OES_texture_float 规范没有说明里面的
当我执行某些几何体的渲染时,我可以在控制台中看到此警告: THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter sho
我正在尝试使用阴影贴图实现阴影,因此我需要将场景渲染到单独的帧缓冲区(纹理)。我无法让它正常工作,因此在剥离我的代码库后,我留下了一组相对简单的指令,这些指令应该将场景渲染到纹理,然后简单地渲染纹理。
我在 XNA 中使用带有自定义着色器的标准 .fbx 导入器。当我使用 BasicEffect 时,.fbx 模型被 UV 正确包裹并且纹理正确。但是,当我使用我的自定义效果时,我必须将纹理作为参数加
如果我创建一个 .PNG 1024 x 1024 的纹理并在中间画一个 124 x 124 的圆,它周围是空的,它使用的 RAM 量是否与我画一个 124 x 的圆一样124 x 124 空间上的 1
我试图在 Android 中绘制一个地球仪,为此我使用了 OpenGL。然而,为了让它更容易理解,我将从制作一个简单的 3D 立方体开始。我使用 Blender 创建我的 3D 对象(立方体),并在我
文本本身的背景图像层是否有任何 JS/CSS 解决方案? 示例 最佳答案 检查这个http://lea.verou.me/2012/05/text-masking-the-standards-way/
非功能代码: if sprite.texture == "texture" { (code) } 当 Sprite 具有特定纹理时,我正在尝试访问 Sprite 的纹理以运行代码。目前纹理仅在我的
我正在尝试学习适用于 iOS 的 SceneKit 并超越基本形状。我对纹理的工作原理有点困惑。在示例项目中,平面是一个网格,并对其应用了平面 png 纹理。你如何“告诉”纹理如何包裹到物体上?在 3
基本上, 这有效: var expl1 = new THREE.ImageUtils.loadTexture( 'images/explodes/expl1.png' ); this.material
我正在尝试将各种场景渲染为一组纹理,每个场景都有自己的纹理到应该绘制的位置...... 问题: 创建 512 个 FBO,每个 FBO 绑定(bind)了 512 个纹理,这有多糟糕。只使用一个 FB
我正在使用文本 protobuf 文件进行系统配置。 我遇到的一个问题是序列化的 protobuf 格式不支持注释。 有没有办法解决? 我说的是文本序列化数据格式,而不是方案定义。 这个问题是有人在某
我想将我的 3D 纹理的初始化从 CPU 移到 GPU。作为测试,我编写了一个着色器将所有体素设置为一个常数值,但纹理根本没有修改。我如何使它工作? 计算着色器: #version 430 layou
我可以像这样用 JavFX 制作一个矩形: Rectangle node2 = RectangleBuilder.create() .x(-100) .
我在 iPhone 上遇到了 openGL 问题,我确信一定有一个简单的解决方案! 当我加载纹理并显示它时,我得到了很多我认为所谓的“色带”,其中颜色,特别是渐变上的颜色,似乎会自动“优化”。 只是为
假设我有一个域类 class Profile{ String name byte[] logo } 和一个 Controller : class ImageController {
我正在开发一款使用 SDL 的 2D 游戏。由于某些系统的 CPU 较弱而 GPU 较强,因此除了普通的 SDL/软件之外,我还有一个使用 OpenGL 的渲染器后端。 渲染器界面的简化版本如下所示:
我是一名优秀的程序员,十分优秀!